Spring Security自定义UserDetailsS​​ervice和自定义User类

我试图在de user主对象中保存其他数据。

我做的是:

实现我的现有用户类的“UserDetails”接口,其中保存了我的附加数据(如电子邮件地址等)。

@Entity public class User implements UserDetails { 

然后我创建了一个UserDetailsS​​ervice实现:

 @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; } } 

最后一步是在我的安全配置中添加UserDetailsS​​ervice。

 @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。

有什么我想念的吗?

先谢谢你。

好。 我的问题隐藏在我没有发布的代码中。

我认为这个detailsS​​ervice只是为了获得更多细节,但它用于登录本身。

我另外配置了“jdbcAuthentication”,spring似乎总是使用它。

既然我只配置了detailsS​​ervice,一切正常。

编辑。:

所以我只需删除此代码:

 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 authorities) { super(user.getName(), user.getPassword(), authorities); this.user = user; } public CustomUserDetails(User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { super(user.getName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); this.user = user; } public User getUser() { return user; } } 

然后将其添加到UserDetailsS​​ervice:

 @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()