我试图将其他数据保存在de用户主体对象中。

我所做的是:

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

@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”的输出)。

当我尝试访问 Controller 中的主体对象时->
System.out.println(SecurityContextHolder.getContext()
                .getAuthentication().getPrincipal());

我没有其他数据。
当我尝试将其强制转换为User对象时,出现无法强制转换的异常。

有什么我想念的吗?

先感谢您。

最佳答案

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

我认为此detailsS​​ervice仅用于获取其他详细信息,但它用于登录本身。

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

现在,我只配置了detailsS​​ervice,一切正常。

编辑。:

所以我只需要删除此代码:

auth.jdbcAuthentication() .dataSource(dataSource)
     * .passwordEncoder(passwordEncoder) .usersByUsernameQuery(
//   ....

现在,它也可以与上述问题中的代码一起使用。

关于java - Spring Security自定义UserDetailsS​​ervice和自定义User类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25383286/

10-12 00:38