Spring Security - 预身份验证 - 在DB中定义的授权和设置角色

时间:2015-01-07 23:43:58

标签: spring-security roles pre-authentication

我们的应用程序的身份验证通过siteminder代理进行,但授权是通过我们的应用程序控制的。

我正在使用org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter检查标题。我还定义了UserDetailsS​​ervice来加载用户详细信息。

我还需要为用户设置角色,以便我可以使用spring安全标记库和其他spring方法来检查角色并显示选项。

我该如何实现?

我在我的用户详细信息服务实现中尝试了以下语句,但似乎无法正常工作。

    Authentication auth = new UsernamePasswordAuthenticationToken(user, null, roles);
    SecurityContextHolder.getContext().setAuthentication(auth);

我还阅读了有关AbstractPreAuthenticatedProcessingFilter类的内容,但看起来这可能对此无用。

对此问题的任何帮助都会非常有帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

我试图在UserDetailsS​​ervice中设置角色(使用我的问题中的语句) 实施,它没有工作。

解-1: 我编写了一个子类PreAuthenticatedAuthenticationProvider并重写了authenticate方法,如下所示:

public class CustomPreAuthenticatedAuthenticationProvider extends PreAuthenticatedAuthenticationProvider {


    @Autowired
    DBConfig dbConfig;

    @Override
    public Authentication authenticate(Authentication authentication)throws AuthenticationException {
        Authentication auth = super.authenticate(authentication);

        User user = (User)auth.getPrincipal();

        Set<Role> roles = new HashSet<Role>();

        String[] rolesArray = dbConfig.getRoles(user.getAccessLevel());
        for(String role: rolesArray){
            Role r = new Role();
            r.setName(role);
            roles.add(r);
        }

        user.setRoles(roles);

        auth = new UsernamePasswordAuthenticationToken(user, null, roles);

        return auth;
    }


}

解决方案-2: 我尝试在控制器中设置角色(身份验证后的主页)并且它工作正常。但看起来Solution-1是标准解决方案。