Spring Security自定义UserDetailsService和自定义User类
我试图在de user主对象中保存其他数据。
我做的是:
实现我的现有用户类的“UserDetails”接口,其中保存了我的附加数据(如电子邮件地址等)。
@Entity public class User implements UserDetails {
然后我创建了一个UserDetailsService实现:
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired UserDAO userDAO; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userDAO.findOneByUsername(username); if (user == null) throw new UsernameNotFoundException("username " + username + " not found"); System.out.println("---------------------> FOUND ------------->" + user.getEmail()); return user; } }
最后一步是在我的安全配置中添加UserDetailsService。
@Configuration @EnableWebMvcSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()); // ... } @Override protected void configure(HttpSecurity http) throws Exception { http.userDetailsService(userDetailsService()); // ... } @Override protected UserDetailsService userDetailsService() { return userDetailsService; }
我在我的控制台中看到“loadUserByName”被调用两次(因为“Found”输出)。
当我尝试访问我的控制器中的主要对象 – >
System.out.println(SecurityContextHolder.getContext() .getAuthentication().getPrincipal());
我没有得到我的额外数据。 当我尝试将其强制转换为我的User对象时,我得到一个无法转换exception。
有什么我想念的吗?
先谢谢你。
好。 我的问题隐藏在我没有发布的代码中。
我认为这个detailsService只是为了获得更多细节,但它用于登录本身。
我另外配置了“jdbcAuthentication”,spring似乎总是使用它。
既然我只配置了detailsService,一切正常。
编辑。:
所以我只需删除此代码:
auth.jdbcAuthentication() .dataSource(dataSource) * .passwordEncoder(passwordEncoder) .usersByUsernameQuery( // ....
现在它也适用于上面问题中的代码。
创建Extention类:
public class CustomUserDetails extends org.springframework.security.core.userdetails.User{ private User user; public CustomUserDetails(User user, Collection extends GrantedAuthority> authorities) { super(user.getName(), user.getPassword(), authorities); this.user = user; } public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection extends GrantedAuthority> authorities) { super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); this.user = user; } public User getUser() { return user; } }
然后将其添加到UserDetailsService:
@Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException { UserDetails userDetails = null; User user = userService.getByLogin(login); userDetails = new CustomUserDetails(user, true, true, true, true, getAuthorities(user.getRole())); return userDetails; }
得到它!
(CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()