Estoy usando Spring 3.0 y Spring Security 3. Soy capaz de autenticar a un usuario en una base de datos utilizando Spring Security. Uso:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

Soy capaz de recuperar el nombre de usuario de la sesión actual del usuario. Quiero añadir detalles adicionales como el id de usuario y el módulo de accesos a los principales objetos almacenados en la Primavera de contexto de Seguridad para que yo pueda recuperar más tarde. ¿Cómo puedo agregar detalles adicionales con el objeto principal y, a continuación, ¿cómo puedo recuperarlo más tarde en un jsp o clase de java. Por favor proveer un fragmento de código, si es posible.

Edit: estoy usando JDBC para acceder a mi base de datos.

Gracias de antemano.

  • La creación de su propia UserDetails aplicación y su propia UserDetailsService aplicación. Con que usted puede hacer lo que quiera. Agregar las propiedades que desee etc.
  • Gracias. He estado tratando de hacer lo mismo, pero creo que estoy haciendo algo mal. @M. Deinum Podría usted por favor me proporcione un fragmento de código donde se ha implementado con éxito
InformationsquelleAutor newUser | 2013-12-03

4 Comentarios

  1. 22

    Para añadir más detalles a los que el usuario autenticado. Primero deberá crear su propia implementación del objeto de Usuario que se debe extender el resorte de seguridad objeto de Usuario. Después de que usted puede agregar las propiedades que desea agregar al usuario autenticado. Una vez hecho esto usted necesita para volver a la implementación del objeto de usuario en UserDetailService (Si no está usando LDAP para la autenticación). Este enlace proporciona los detalles para añadir más detalles a los que el usuario autenticado–

    http://javahotpot.blogspot.in/2013/12/spring-security-adding-more-information.html

    • Podría también registra la aplicación de loadUserDetails(nombre de usuario) en LoginService del ejemplo de enlace. Quiero saber cómo el error de autenticación de las solicitudes se gestionarán. Gracias de antemano
    • Respondió en el mencionado enlace solo..javahotpot.blogspot.en/2013/12/…
    • Su enlace a su blog no es totalmente responder a la pregunta, como se pedía la implantación de LoginService. Normalmente, usted debe responder a la pregunta en este sitio, no hacen referencia a un post en su blog.
    • Por qué dijo que Si usted no está usando LDAP para la autenticación ? Se esta solución no funciona con LDAP?
    • porque con este servicio usted necesita para volver a la contraseña para la primavera, y usted no puede leer la contraseña de LDAP.. en su lugar, el uso de LDAP puede implementar un AuthenticationProvider
  2. 13

    Aquí es lo que usted necesita:

    1. Extender la primavera User (org.springframework.security.core.userdetails.User) de la clase y lo que alguna vez las propiedades que necesita.
    2. Extender la primavera UserDetailsService (org.springframework.security.core.userdetails.UserDetailsService) y llenar la de arriba objeto. Reemplazar loadUserByUsername y volver a su extensa clase de usuario
    3. Personalizar UserDetailsService en AuthenticationManagerBuilder

    Por ejemplo

    public class CurrentUser extends User{
    
       //This constructor is a must
        public CurrentUser(String username, String password, boolean enabled, boolean accountNonExpired,
                boolean credentialsNonExpired, boolean accountNonLocked,
                Collection<? extends GrantedAuthority> authorities) {
            super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        }
        //Setter and getters are required
        private String firstName;
        private String lastName;
    
    }

    La Costumbre userdetails podría ser:

    @Service("userDetailsService")
    public class CustomUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
    //Try to find user and its roles, for example here we try to get it from database via a DAO object
    //Do not confuse this foo.bar.User with CurrentUser or spring User, this is a temporary object which holds user info stored in database
    foo.bar.User user = userDao.findByUserName(username);
    //Build user Authority. some how a convert from your custom roles which are in database to spring GrantedAuthority
    List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
    //The magic is happen in this private method !
    return buildUserForAuthentication(user, authorities);
    }
    //Fill your extended User object (CurrentUser) here and return it
    private User buildUserForAuthentication(foo.bar.User user, 
    List<GrantedAuthority> authorities) {
    String username = user.getUsername();
    String password = user.getPassword();
    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;
    return new CurrentUser(username, password, enabled, accountNonExpired, credentialsNonExpired,
    accountNonLocked, authorities);
    //If your database has more information of user for example firstname,... You can fill it here 
    //CurrentUser currentUser = new CurrentUser(....)
    //currentUser.setFirstName( user.getfirstName() );
    //.....
    //return currentUser ;
    }
    private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {
    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
    //Build user's authorities
    for (UserRole userRole : userRoles) {
    setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
    }
    return new ArrayList<GrantedAuthority>(setAuths);
    }
    }

    Configurar la primavera contexto de seguridad

    @Configuration
    @EnableWebSecurity
    @PropertySource("classpath://configs.properties")
    public class SecurityContextConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    @Qualifier("userDetailsService")
    private UserDetailsService userDetailsService;
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService);
    }

    Se hace todo !

    Puede llamar (CurrentUser)getAuthentication().getPrincipal() para conseguir que recién CurrentUser o establecer algunas propiedades.

    • Esto funciona, pero cuando se reinicia el servidor, nos encontramos con problemas con las sesiones existentes: java.lang.ClassCastException: ser.en el escaparate.imicloud.de seguridad.MyUserDetails no se puede lanzar a ser.en el escaparate.imicloud.de seguridad.MyUserDetails. ¿Cómo lo manejan?
    • por favor, pregunte a una pregunta diferente con la totalidad de la traza de la pila!
  3. 10

    (Voy a suponer que usted tiene un básico de la Primavera de la configuración de Seguridad de trabajo y saber cómo los componentes básicos de trabajo juntos)

    La mayoría de la manera «correcta» sería proporcionar su propia implementación de AuthenticationProvider, que devuelven una costumbre Autenticación aplicación. A continuación, puede rellenar este Authentication ejemplo, con todo lo que usted necesita. Por ejemplo:

    public class MyAuthentication extends UsernamePasswordAuthenticationToken implements Authentication {
    public MyAuthentication(Object principal, Object credentials, int moduleCode) {
    super(principal, credentials);
    this.moduleCode = moduleCode;
    }
    public MyAuthentication(Object principal, Object credentials,  Collection<? extends GrantedAuthority> authorities,int moduleCode) {
    super(principal, credentials, authorities);
    this.moduleCode = moduleCode;
    }
    private int moduleCode;
    public getModuleCode() {
    return moduleCode;
    }   
    }
    public class MyAuthenticationProvider extends DaoAuthenticationProvider {
    private Collection<GrantedAuthority> obtainAuthorities(UserDetails user) {
    //return granted authorities for user, according to your requirements
    }
    private int obtainModuleCode(UserDetails user) {
    //return moduleCode for user, according to your requirements
    }
    @Override
    public Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
    //Suppose this user implementation has a moduleCode property
    MyAuthentication result = new MyAuthentication(authentication.getPrincipal(),
    authentication.getCredentials(),
    obtainAuthorities(user),
    obtainModuleCode(user));
    result.setDetails(authentication.getDetails());
    return result;
    }
    }

    Y, a continuación, en applicationContext.xml:

    <authentication-manager>
    <authentication-provider ref="myAuthenticationProvider">
    </authentication-manager>
    <bean id="myAuthenticationProvider" class="MyAuthenticationProvider" scope="singleton">
    ...
    </bean>

    Yo creo que se podría conseguir trabajo al proporcionar implementaciones personalizadas de AuthenticationDetails y AuthenticationDetailsSource, pero creo que sería una menos limpio enfoque.

  4. 4

    El «sólo» cosas que usted necesita hacer es crear tu propio UserDetailsService aplicación que devuelve su propia implementación de un UserDetails objeto.

    Ver aquí para un tutorial que implementa un JPA basado UserDetailsService.

    • Estoy usando JDBC para conectarse a la base de datos. Puede especificar los cambios que tendría que hacer en el tutorial ya que es JPA base.
    • No estoy seguro de cómo manejar los fallado la autenticación de las solicitudes con JDBC cuando configuro el loadUserByUsername(String username) de UserDetailsService. Me podrían ayudar con eso.
    • ¿Por qué usted necesita para manejar fallado la autenticación de las solicitudes? La primavera hace por ti y que no cambia a la hora de implementar su propia UserDetailsService.
    • Tomemos, por ejemplo, el escenario cuando el nombre de usuario y la contraseña no coinciden, ¿cómo debo manejar que cuando configuro el método. Debo devolver un objeto nulo en ese caso?
    • No manejar que, spring security controla que para usted. El UserDetailsService es SÓLO para buscar usuarios NO para la comprobación de la contraseña. Como notado que existe sólo un método loadUserByUsername el nombre del método que lo dice todo, el mismo de los atributos del método, no hay ninguna contraseña es así ¿cómo validar la contraseña?!
    • Cuando es el método loadUserByUsername llamado en el proceso de autenticación y cómo la autenticación suceder cuando puedo crear implementaciones personalizadas de UserDetails y UserDetailsService. Perdón por mi falta de conocimiento ya que soy bastante nuevo en Primavera
    • Spring Security, se llama al método y después, dependiendo de su configuración, comprueba la contraseña. La autenticación no cambia, no cambia nada SÓLO ¿dónde/cómo obtener su información de usuario. Como siempre que sea de un UserDetails aplicación no cambia nada.
    • Gracias M. Deinum, yo lo tengo y soy capaz de añadir información al usuario.

Dejar respuesta

Please enter your comment!
Please enter your name here