SPRING:向Spring安全用户添加自定义用户详细信息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPRING:向Spring安全用户添加自定义用户详细信息相关的知识,希望对你有一定的参考价值。
我目前正在开发一个Spring MVC应用程序,我需要在登录时向我的Spring Security登录用户添加一个自定义字段(我插入用户名,密码,自定义值)。当用户登录时(例如,通过pricipal.getValue),该值必须在任何地方都可用。
我阅读了很多关于自定义用户类和自定义服务的内容,但无法真正找到解决问题的解决方案......
任何帮助都会很棒!
答案
就像Avinash所说,你可以让你的User
类实现UserDetails
,你也可以实现UserDetailsService
并覆盖相应的方法来返回自定义的User
对象:
@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;
}
}
你只需使用自定义WebConfigurerAdapter
配置你的UserdetailsService
:
@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 ...//
}
}
这里,自定义UserDetails
实现的示例:custom UserDetails
另一答案
创建实现UserDetails
接口的类。
public class User implements UserDetails {
// Your user properties
// implement methods
}
然后,一旦通过身份验证,您就可以像这样访问项目中的任何位置。
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
以上是关于SPRING:向Spring安全用户添加自定义用户详细信息的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 DaoAuthenticationProvider 向 Spring 应用程序添加一个 REST Angular 自定义登录页面