Grails,Spring Security和Siteminder - 资源或用户详细信息的问题

Dz.*_*Dz. 8 grails resources siteminder filter spring-security

我试图基于Siteminder的preAuth来确保我的grails应用程序具有spring security.这基本上就是我所需要的.该应用程序仅用于检查一些东西,因此不需要数据库.

我陷入了一些我无法接受的过滤器问题.

起初我只使用了RequestHeaderAuthenticationFilter和自定义UserDetails以及UserDetailsS​​ervice.

我的春豆:

beans = {
    userDetailsService(MyUserDetailsService)

    userDetailsServiceWrapper(UserDetailsByNameServiceWrapper) {
            userDetailsService = ref('userDetailsService')
    }

    preauthAuthProvider(PreAuthenticatedAuthenticationProvider) {
            preAuthenticatedUserDetailsService = ref('userDetailsServiceWrapper')
    }

    requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter){
        principalRequestHeader='SM_USER'
        authenticationManager = ref('authenticationManager')
    }
}
Run Code Online (Sandbox Code Playgroud)

我有我的MyUserDetailsProvider:

class MyUserDetailsService  implements GrailsUserDetailsService {

    MyUserDetails  loadUserByUsername(String username) throws UsernameNotFoundException{

        //some super secret code here ;)
        return new MyUserDetails(some needed params)
    }
}
Run Code Online (Sandbox Code Playgroud)

我还在每个明智的教程中配置了安全的URL:

grails.plugins.springsecurity.interceptUrlMap = [
    '/user/**':['ROLE_MINE'],
    '/activation/**':['ROLE_SOMEOTHER, ROLE_MINE'],
    '/js/**':        ['IS_AUTHENTICATED_ANONYMOUSLY'],
    '/css/**':       ['IS_AUTHENTICATED_ANONYMOUSLY'],
    '/images/**':    ['IS_AUTHENTICATED_ANONYMOUSLY'],
    '/*':            ['IS_AUTHENTICATED_ANONYMOUSLY']
]
Run Code Online (Sandbox Code Playgroud)

和一些提供者(在一些教程中建议保持匿名):

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider']
Run Code Online (Sandbox Code Playgroud)

它非常适合数据访问,但它不允许加载资源,特别是图像.错误表示在请求中找不到SM_USER标头.

所以我认为我可以使用像'filters:none'或'security:none'这样的解决方案,以便spring在不检查SM_USER的情况下知道url请求的内容.

我尝试添加过滤器和filterChain的东西:

grails.plugins.springsecurity.filterNames = ['requestHeaderAuthenticationFilter']

grails.plugins.springsecurity.filterChain.chainMap = [
    '/user/**': 'requestHeaderAuthenticationFilter',
    '/activation/**': 'requestHeaderAuthenticationFilter',
    '/*': 'requestHeaderAuthenticationFilter'
]
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.

然后我尝试使用其他一些过滤器在没有SM_USER标头的资源上使用.从参考文献我了解匿名过滤器可能就足够了.

所以我做了一些改变:

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider']

grails.plugins.springsecurity.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter']

grails.plugins.springsecurity.filterChain.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter'
Run Code Online (Sandbox Code Playgroud)

]

grails.plugins.springsecurity.filterChain.chainMap = [
    '/user/**': 'requestHeaderAuthenticationFilter',
    '/versionone/**': 'requestHeaderAuthenticationFilter',
    '/activation/**': 'requestHeaderAuthenticationFilter',
    '/js/**': 'anonymousAuthenticationFilter',
    '/css/**': 'anonymousAuthenticationFilter',
    '/images/**': 'anonymousAuthenticationFilter',
    '/*': 'requestHeaderAuthenticationFilter'
]
Run Code Online (Sandbox Code Playgroud)

YAY帮助了图像.但是另一个问题开始发生了.

当auth正确时,我应该返回myUserDetails对象,而不是经常获取一些String对象.并且我的应用程序无法在此String对象中找不到一个属性(这很明显,因为它不存在;))

有谁知道如何处理这个问题?从显示图像中退出不是一种选择;)

有没有办法在spring security grails配置中从filterchain中排除图像/其他资源......?就像用普通的Java .xml方式做的那样......?

我将感谢所有帮助和建议如何解决这个问题.

谢谢 !!!

//编辑:如果有人使用此作为参考设置siteminder sso的安全性,请注意添加:

checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'
Run Code Online (Sandbox Code Playgroud)

您的requestHeaderAuthenticationFilter的属性.否则,在调用springSecurityService.getPrincipal()时,您将在http会话中处理未更新的权限,因此用户可能"以其他人身份登录".:)还要考虑将bean的范围更改为"prototype".

Dz.*_*Dz. 2

如果有人感兴趣 - 我找到了这个问题的一些解决方法:

1.要求 SiteMinder 管理员将 SM_USER 标头添加到所有图像或仅限于 url 位置的某些图像集。由于一般性能,默认情况下禁用此功能。然后松开所有附加过滤器,并与 preAuth 过滤器一起幸福地生活。

2.使用静态内容而不是在 .war 中包含图像并重定向:]

如何:

将所有需要的图像放入 var/www/yourfolder/images 向您的 httpd 配置添加一些别名:

Alias /yourapp/imgs var/www/yourfolder/images
ProxyPass /yourapp/imgs !
Run Code Online (Sandbox Code Playgroud)

重新启动您的服务 快乐地使用图像:D

我知道这不是解决方案,而只是解决方法。但它确实有效。我仍然很高兴听到一些更好的想法:)

干杯。