请考虑以下场景:Spring Security根据自定义UserDetailsService
实现验证登录数据,如下所示
@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
UserProfile profile = users.find(name);
if (profile.getUsername().equals("admin"))
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new User(profile.getUsername(), profile.getPassword(), authorities);
}
如果身份验证成功,我想在控制器中创建唯一的session scoped service
,并通过有效的UserProfile
对象状态自定义行为。我想最好的方法是在配置文件中手动声明会话bean,并以某种方式 autowire UserProfile
或会话所有者到它的构造函数,但是这是怎么回事,当UserProfile
甚至不是托管对象?
在这种情况下,我希望服务器为经过身份验证的用户创建服务,该用户使用UserProfile
另外,如何限制创建此类服务只是为了登录?有没有办法实现这种行为,或者它实际上是不好的架构?
答案 0 :(得分:0)
您可以使用SecurityContextHolder访问经过身份验证的用户以获取当前请求。我认为最好的方法是使用如下方法创建单例服务:
public UserDetails getCurrentUser() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
return (UserDetails) principal;
} else {
//handle not authenticated users
return null;
}
}
现在您可以在控制器中自动装配和使用该服务。