web-dev-qa-db-fra.com

PRINTEMPS: Ajoutez des détails utilisateur personnalisés à l'utilisateur de sécurité Spring

Je travaille actuellement sur une application Spring MVC et je dois ajouter un champ personnalisé à mon utilisateur de connexion Spring Security dès que je me connecte (j'insère un nom d'utilisateur, un mot de passe, une valeur personnalisée). Cette valeur doit être disponible partout où l'utilisateur est connecté (par exemple via pricipal.getValue).

J'ai beaucoup lu sur les classes d'utilisateurs personnalisées et les services personnalisés, mais je ne trouve pas vraiment de solution de travail à mon problème ...

Toute aide est la bienvenue!

10
counter1602

Tout comme Avinash l'a dit, vous pouvez faire en sorte que votre classe User implémente UserDetails et vous pouvez également implémenter UserDetailsService et remplacer les méthodes correspondantes pour renvoyer l'objet User personnalisé:

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

    //get user from the database, via Hibernate
    @Autowired
    private UserDao userDao;

    @Transactional(readOnly=true)
    @Override
    public UserDetails loadUserByUsername(final String username)
        throws UsernameNotFoundException {
//CUSTOM USER HERE vvv
        User user = userDao.findByUserName(username);
        List<GrantedAuthority> authorities =
                                      buildUserAuthority(user.getUserRole());
//if you're implementing UserDetails you wouldn't need to call this method and instead return the User as it is
        //return buildUserForAuthentication(user, authorities);
return user;

    }

    // Converts user to spring.springframework.security.core.userdetails.User
    private User buildUserForAuthentication(user,
        List<GrantedAuthority> authorities) {
        return new User(user.getUsername(), user.getPassword(),
            user.isEnabled(), true, true, true, authorities);
    }

    private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {

        Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

        // add user's authorities
        for (UserRole userRole : userRoles) {
            setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
        }

        List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

        return Result;
    }

}

Et vous configurez simplement votre WebConfigurerAdapter en utilisant le UserdetailsService personnalisé:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    //authorization logic here ...
}

    @Bean
    public PasswordEncoder passwordEncoder(){
        // return preferred PasswordEncoder ...//
    }


}

Ici, un exemple d'implémentation personnalisée de UserDetails: serDetails personnalisés

18
Daniel Arechiga

Créez votre classe implémentant l'interface UserDetails.

public class User implements UserDetails {
    // Your user properties
    // implement methods
}

Et puis, une fois authentifié, vous pouvez accéder à cet objet n'importe où dans le projet comme celui-ci.

User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
8
Avinash