Grails 将OpenAM、tomcat J2EE策略代理与支持Spring安全性的web应用程序集成

Grails 将OpenAM、tomcat J2EE策略代理与支持Spring安全性的web应用程序集成,grails,spring-security,openam,Grails,Spring Security,Openam,我们正在尝试使用spring安全性进行细粒度授权,同时在应用领域使用openam策略特性进行用户身份验证和粗粒度授权。我所说的粗粒度是指带有主题的简单URI规则。我所说的细粒度授权是指web应用程序级别,例如使用ACL和使用spring安全ACL 为了实现这一点,我想到的一种方法是使用《Spring安全参考手册》中概述的**Spring Security PreAuthenticationFilters**。我读了这个问题后有了这个想法 为了进行快速原型设计,我选择Grails2.2.3作为we

我们正在尝试使用spring安全性进行细粒度授权,同时在应用领域使用openam策略特性进行用户身份验证和粗粒度授权。我所说的粗粒度是指带有主题的简单URI规则。我所说的细粒度授权是指web应用程序级别,例如使用ACL和使用spring安全ACL

为了实现这一点,我想到的一种方法是使用《Spring安全参考手册》中概述的**Spring Security PreAuthenticationFilters**。我读了这个问题后有了这个想法

为了进行快速原型设计,我选择Grails2.2.3作为web应用程序平台,在OpenAM和OpenAM J2EE策略代理接口后面提供spring security核心插件和ACL。OpenAM策略设置为对用户进行身份验证,并在策略响应头中返回uid(Ldap用户id)。这被映射到响应提供程序中的用户_ID,并由策略代理作为HTTP头发送

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

beans = {
   preAuthenticatedGrantedAuthoritiesUserDetailsService(PreAuthenticatedGrantedAuthoritiesUserDetailsService)



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

requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter) {
    authenticationManager = ref('authenticationManager')
    principalRequestHeader = 'USER_ID'
 }
}
def init = {
    servletContext -> 
    
    SpringSecurityUtils.clientRegisterFilter('requestHeaderAuthenticationFilter',SecurityFilterPosition.PRE_AUTH_FILTER);
}
BootStrap.groovy如下所示:

beans = {
   preAuthenticatedGrantedAuthoritiesUserDetailsService(PreAuthenticatedGrantedAuthoritiesUserDetailsService)



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

requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter) {
    authenticationManager = ref('authenticationManager')
    principalRequestHeader = 'USER_ID'
 }
}
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)
关于如何解决问题的任何线索,或对方法本身的评论/建议


感谢您的回复。

代理筛选器必须是筛选器链中的第一个。。。保证


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

是的,是的。谢谢我修复了header变量。问题在于将身份验证令牌映射到授予的权限。试图理解《Spring安全手册》中的流程。@user2527121:嘿,我正试图实现同样的目标,你能带我完成这些步骤吗。我需要spring安全配置部分。