如何通过当前用户自定义会话范围bean的行为是Spring MVC

时间:2016-04-23 10:16:52

标签: spring spring-mvc session authentication spring-security

请考虑以下场景: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

中存储的凭据维护与远程主机的SSH连接

另外,如何限制创建此类服务只是为了登录?有没有办法实现这种行为,或者它实际上是不好的架构?

1 个答案:

答案 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;
    }
}

现在您可以在控制器中自动装配和使用该服务。