我怎样才能翻译"在Servlet中获取的角色Preauthentication过滤到Spring Security可以使用的角色?

时间:2015-09-29 15:13:13

标签: spring-mvc spring-security servlet-filters

Spring Security可能是新用户的噩梦。没有什么是可靠的,一切都可以通过一些@Autowired bean或其他来配置,有一百万个选项,看似简单的事情很快变得非常复杂。

< Rant结束>

现在,我对企业内部网应用程序有以下要求和设置:

1)我试图避免使用security.xml并使用java注释配置所有内容。

2)有一个基于cookie的中央企业认证服务,它将用户认证为有权使用企业内部网的人。用户名和密码在那里处理,应用程序不关心它们。那里有很多其他信息,其中大部分都是我的应用所不需要的。绝对必要的是用户输入的用户ID并由服务验证。这将进入Principal,也可用作会话数据。此服务作为servlet过滤器提供。

3)此过滤器包括一个配置选项,通过该选项可以连接适配器,以执行其他任务,例如从应用程序维护的数据库中获取经过身份验证的用户的特定于应用程序的角色。我正在使用这样的适配器执行此任务,它将数据库中的角色添加到某些结构中会话属性中的对象。在此过滤器和适配器执行结束时,用户的特定于应用程序的角色位于会话数据中。

4)我添加了一个派生自com.att.voicetone.cwing.security.AbstractSecurityWebApplicationInitializer的类,并在其beforeSpringSecurityFilterChain()方法中,从步骤2(包括步骤3中的适配器)注册了此过滤器,以便首先完成。以上所有工作正如我希望的那样起作用。

5)现在,我正在研究如何将所有这些与Spring Security联系起来。我的目标是能够使用这样的东西:

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
        .antMatchers("/index.html","/transcripts.html").hasRole("MY_APP_USER");
    http.authorizeRequests()
        .antMatchers("/assign.html","/report.html").hasRole("MY_APP_ADMIN");
    http.authorizeRequests()
        .antMatchers("/", "/x/**", "/audio/**").hasRole("MY_APP_USER");
    http.authorizeRequests()
        .antMatchers("/oam/**").hasRole("MY_APP_ADMIN");

}

似乎我必须做的是实现一个扩展org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter的类,并将其插入到过滤器链中并以某种方式对其进行编码以将角色信息转换为hasRole()调用的格式以上将找到他们正在寻找的信息。

但这是重点,毕竟"硬"工作似乎已经完成,我遇到了无数的ConfigurationBuilders,AuthenticationManagers,AuthenticationTokens等,所有这些都有很多自定义机会,其中任何一个似乎都不适合"简单"我觉得在某个地方等待我的任务,在可配置选项的混乱中,我无法通过几个小时的代码,javadocs等来找到它。

如果你到目前为止跟着我,那么从上面的会话对象中翻译角色所缺少的最佳点是什么,以便SpringSecurity可以用hasRole()代码处理它们?

或者换句话说,hasRole()在哪里寻找,以及在那里找到什么?

1 个答案:

答案 0 :(得分:0)

这个问题的答案是你在AuthenticationDetailsS​​ource中进行“翻译”,它创建了具有GrantedAuthorities集合的UserDetails对象。那是我失踪的那件作品。

然而,我仍然没有走出困境。关于我的下一个SO问题......