Necesito para autenticar a los usuarios de la base de datos, la Primavera de la Seguridad de los documentos no dicen cómo autenticar con hibernate. Es posible y cómo puedo hacer eso?

InformationsquelleAutor newbie | 2010-04-21

3 Comentarios

  1. 133

    Usted tiene que hacer su propio proveedor de autenticación.

    Ejemplo de código:

    El servicio de carga de los Usuarios de Hibernación:

    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;    
    
    @Service("userDetailsService") 
    public class UserDetailsServiceImpl implements UserDetailsService {
    
      @Autowired private UserDao dao;
      @Autowired private Assembler assembler;
    
      @Transactional(readOnly = true)
      public UserDetails loadUserByUsername(String username)
          throws UsernameNotFoundException, DataAccessException {
    
        UserDetails userDetails = null;
        UserEntity userEntity = dao.findByName(username);
        if (userEntity == null)
          throw new UsernameNotFoundException("user not found");
    
        return assembler.buildUserFromUserEntity(userEntity);
      }
    }

    El servicio de convertir su entidad a un resorte de objeto de usuario:

    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.authority.GrantedAuthorityImpl;
    import org.springframework.security.core.userdetails.User;
    
    @Service("assembler")
    public class Assembler {
    
      @Transactional(readOnly = true)
      User buildUserFromUserEntity(UserEntity userEntity) {
    
        String username = userEntity.getName();
        String password = userEntity.getPassword();
        boolean enabled = userEntity.isActive();
        boolean accountNonExpired = userEntity.isActive();
        boolean credentialsNonExpired = userEntity.isActive();
        boolean accountNonLocked = userEntity.isActive();
    
        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        for (SecurityRoleEntity role : userEntity.getRoles()) {
          authorities.add(new GrantedAuthorityImpl(role.getRoleName()));
        }
    
        User user = new User(username, password, enabled,
          accountNonExpired, credentialsNonExpired, accountNonLocked, authorities, id);
        return user;
      }
    }

    El espacio de nombres basado en application-context-security.xml sería algo como:

    <http>
      <intercept-url pattern="/login.do*" filters="none"/>
      <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
      <form-login login-page="/login.do"
                  authentication-failure-url="/login.do?error=failed"
                  login-processing-url="/login-please.do" />
      <logout logout-url="/logoff-please.do"
              logout-success-url="/logoff.html" />
    </http>
    
    <beans:bean id="daoAuthenticationProvider"
     class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
      <beans:property name="userDetailsService" ref="userDetailsService"/>
    </beans:bean>
    
    <beans:bean id="authenticationManager"
        class="org.springframework.security.authentication.ProviderManager">
      <beans:property name="providers">
        <beans:list>
          <beans:ref local="daoAuthenticationProvider" />
        </beans:list>
      </beans:property>
    </beans:bean>
    
    <authentication-manager>
      <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="md5"/>
      </authentication-provider>
    </authentication-manager>
    • Gracias por la buena y detallada respuesta con el código completo. Puede usted decirle a mi por qué Ensamblador de clase es necesaria, ¿por qué no puedes simplemente poner ese código en el loadUserByUsername método ??
    • Tienes razón, no hay necesidad real para el Ensamblador. Simplemente pensé que era una buena idea para mantener la userDetailsService simple y realizar la conversión reutilizables a través de la ensamblador de servicio.
    • migh también desea comprobar el uso de la no obsoleto método de usuario static.springsource.org/spring-security/site/docs/3.0.x/apidocs/…
    • ¿Cómo Autowiring trabajo para userDetailsService, mi autowiring no está funcionando. Tuve que definir userDetailsService bean en la seguridad de xml. Cualquier idea. Resto de los lugares que la autowiring está trabajando
    • Lo consiguió. Tenía que poner un elemento más en el archivo xml <context:component-scan base-package="org.xyz" />
    • Gracias @Kdeveloper por compartir este código. ¿En qué momento y cómo se comprueba si la contraseña introducida por el usuario en el formulario de inicio de sesión coincide con el uno (valor de hash, por supuesto) de la base de datos? Gracias!
    • no comprobar si la contraseña (hash) coinciden con los de la Primavera, seguro que para usted automáticamente. Si la contraseña es incorrecta, entonces Spring Security redirige a una contraseña incorrecta URL definida en la Primavera de de Seguridad de configuración XML. Usted sólo tiene que proporcionar objeto de Usuario, donde contraseña es distribuido por corregir algoritmo de hash. También puede utilizar la contraseña de sal si se quiere, pero que requiere más configuración.
    • en referencia a tu comentario. el código se convierte en: el usuario Usuario = new Usuario(nombre de usuario, contraseña, habilitado, accountNonExpired, credentialsNonExpired, accountNonLocked, autoridades);
    • GrantedAuthorityImpl está en desuso, uso SimpleGrantedAuthority lugar
    • He proporcionado una respuesta por debajo de lo que simplifica enormemente la aceptación de la respuesta. Usted realmente no necesita para configurar una costumbre proveedor de autenticación para autenticar contra una base de datos accesible a través de JDBC. Spring Security proporciona una forma de consulta de la base de datos directamente con 9 líneas de XML.
    • ¿puede dar algunos editar/mejora en SimpleGrantedAuthority?

  2. 4

    Si usted está usando un JDBC base de datos de acceso, a continuación, puede utilizar el siguiente proveedor de autenticación y evitar crear uno personalizado. Reduce el código necesario para 9 líneas de XML:

    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" />
    </authentication-provider>

    Puedes configurar el origen de datos como sigue

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>

    Echar un vistazo a este post: http://codehustler.org/blog/spring-security-tutorial-form-login/
    Cubre todo lo que necesita saber acerca de la personalización de la Primavera Seguridad de formulario de inicio de sesión.

    • Podemos usar esto con hash de las contraseñas?
    • Usted debe ser capaz de hash de contraseñas mediante el uso de <contraseña-codificador ref=»encoder»/> el <proveedor de autenticación> etiqueta. El codificador se refiere a la codificación de frijol que deseas utilizar, por ejemplo, org.springframework.de seguridad.crypto.bcrypt.BCryptPasswordEncoder. Alternativamente, si usted está buscando para usar algo como SHA, a continuación, puede agregar <contraseña-codificador hash=»sha» />
  3. 1

    Una configuración de java podría ser algo como esto

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private UserDetailsServiceImpl userDetailsService;
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth)
                throws Exception {
    
            DaoAuthenticationProvider daoAuthenticationProvider =
                    new DaoAuthenticationProvider();
            daoAuthenticationProvider
                    .setUserDetailsService(userDetailsService);
    
            auth.authenticationProvider(daoAuthenticationProvider);
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here