我目前正在开发一个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); Listauthorities = 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 authorities) { return new User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities); } private List buildUserAuthority(Set userRoles) { Set setAuths = new HashSet (); // add user's authorities for (UserRole userRole : userRoles) { setAuths.add(new SimpleGrantedAuthority(userRole.getRole())); } List Result = new ArrayList (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
实现的示例:
自定义UserDetails
创建类实现UserDetails
接口.
public class User implements UserDetails { // Your user properties // implement methods }
然后,一旦通过身份验证,您就可以像这样访问项目中的任何位置.
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();