我们正在尝试使用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)
有关如何解决问题的任何线索,或有关方法本身的意见/建议?
感谢您的回复。
答案 0 :(得分:1)
代理过滤器必须是过滤器链中的第一个...确定?
如果是,则必须在代理配置文件中将调试级别设置为“message”并检查调试日志,很可能是您的代理配置不正确。