3

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

为了做到这一点,我想到的一种方法是使用 spring-security 参考手册中概述的 ** Spring Security PreAuthenticationFilters**。阅读此问题预身份验证后,我得到了这个想法

为了进行快速原型设计,我选择了 Grails 2.2.3 作为 web 应用程序平台,其中包含用于 spring-security-core 的插件以及 OpenAM 和 openam J2EE 策略代理接口后面的 acl。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)

关于如何解决问题的任何线索,或对方法本身的评论/建议?

感谢您的回复。

4

1 回答 1

1

代理过滤器必须是过滤器链中的第一个...有把握吗?

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

于 2013-08-08T08:29:08.770 回答