将OpenAM,tomcat J2EE策略代理与支持Spring Security的Web应用程序集成在一起

时间:2013-08-07 12:38:36

标签: grails spring-security openam

我们正在尝试使用spring安全性进行细粒度授权,同时使用针对应用程序领域的openam策略功能进行用户身份验证和粗粒度授权。粗粒度的意思是简单的URI规则与主题。细粒度授权的含义是在Web应用程序级别,例如使用使用spring-security-acls 的ACL。

要实现这一点,我想到的一种方法是使用弹簧安全参考手册中概述的** Spring Security PreAuthenticationFilters **。我在阅读了这个问题pre-authentication

后得到了这个想法

为了进行快速原型设计,我选择了Grails 2.2.3作为Web应用程序平台,其中包含spring-security-core插件和OpenAM后面的acls以及openam J2EE策略代理接口。 OpenAM策略设置为对用户进行身份验证,并在策略响应头中返回uid(Ldap用户ID)。这将映射到响应提供程序中的USER_ID,并由策略代理作为HTTP标头发送。

grails应用程序 resources.groovy 如下所示:

beans = {
   preAuthenticatedGrantedAuthoritiesUserDetailsService(PreAuthenticatedGrantedAuthoritiesUserDetailsService)



preAuthenticatedAuthenticationProvider(PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService =   ref('preAuthenticatedGrantedAuthoritiesUserDetailsService')
 }

requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter) {
    authenticationManager = ref('authenticationManager')
    principalRequestHeader = 'USER_ID'
 }
}

BootStrap.groovy 如下所示:

def init = {
    servletContext -> 

    SpringSecurityUtils.clientRegisterFilter('requestHeaderAuthenticationFilter',SecurityFilterPosition.PRE_AUTH_FILTER);
}

当我在本地设置中测试时,我收到错误......

org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException: USER_ID header not found in request.
    at org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter.getPreAuthenticatedPrincipal(RequestHeaderAuthenticationFilter.java:43)
    at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doAuthenticate(AbstractPreAuthenticatedProcessingFilter.java:98)
    at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:86)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)
    at org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381)

有关如何解决问题的任何线索,或有关方法本身的意见/建议?

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

代理过滤器必须是过滤器链中的第一个...确定?

如果是,则必须在代理配置文件中将调试级别设置为“message”并检查调试日志,很可能是您的代理配置不正确。