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!
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
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();