我们正在尝试使用 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)
关于如何解决问题的任何线索,或对方法本身的评论/建议?
感谢您的回复。