Grails、Spring Security 和 Siteminder - 资源或用户详情问题

Posted

技术标签:

【中文标题】Grails、Spring Security 和 Siteminder - 资源或用户详情问题【英文标题】:Grails, Spring Security & Siteminder - problems with resources or userDetails 【发布时间】:2012-05-13 04:42:22 【问题描述】:

我正在尝试使用基于 Siteminder 的 preAuth 的 Spring Security 来保护我的 grails 应用程序。这基本上就是我所需要的。该应用程序仅用于检查一些内容,因此不需要数据库。

我遇到了一些我无法接受的过滤器问题。

一开始我只使用了 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')
    

我有我的 MyUserDetailsProvider:

class MyUserDetailsService  implements GrailsUserDetailsService 

    MyUserDetails  loadUserByUsername(String username) throws UsernameNotFoundException

        //some super secret code here ;)
        return new MyUserDetails(some needed params)
    

我还像在每个明智的教程中一样配置了安全 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']
]

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

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

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

所以我认为我可以使用一些解决方案,例如“过滤器:无”或“安全性:无”,以便 spring 无需检查 SM_USER 即可知道允许的 url 请求。

我尝试向 filter 和 filterChain 添加东西:

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

grails.plugins.springsecurity.filterChain.chainMap = [
    '/user/**': 'requestHeaderAuthenticationFilter',
    '/activation/**': 'requestHeaderAuthenticationFilter',
    '/*': 'requestHeaderAuthenticationFilter'
]

但它没有帮助。

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

所以我做了一些改变:

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

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

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

]

grails.plugins.springsecurity.filterChain.chainMap = [
    '/user/**': 'requestHeaderAuthenticationFilter',
    '/versionone/**': 'requestHeaderAuthenticationFilter',
    '/activation/**': 'requestHeaderAuthenticationFilter',
    '/js/**': 'anonymousAuthenticationFilter',
    '/css/**': 'anonymousAuthenticationFilter',
    '/images/**': 'anonymousAuthenticationFilter',
    '/*': 'requestHeaderAuthenticationFilter'
]

对图像有帮助。但另一个问题开始出现。

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

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

有没有办法在 spring security grails 配置中从过滤器链中排除图像/其他资源......?就像以普通的 Java .xml 方式完成的一样...?

我将不胜感激如何解决此问题的所有帮助和建议。

谢谢!!!

//编辑:如果有人将其用作设置站点管理员 sso 安全性的参考,请注意添加:

checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'

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

【问题讨论】:

【参考方案1】:

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

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

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

如何:

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

Alias /yourapp/imgs var/www/yourfolder/images
ProxyPass /yourapp/imgs !

重启你的服务 快乐地使用图片:D

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

干杯。

【讨论】:

以上是关于Grails、Spring Security 和 Siteminder - 资源或用户详情问题的主要内容,如果未能解决你的问题,请参考以下文章

Grails + spring-security-core:用户登录后如何分配角色?

Grails 3 和 Spring Security:当用户未登录时返回 401

Grails - Spring Security / Social - Facebook 插件 setAccessToken 和 getAccessToken

ClassNotFoundException: SimpleGrantedAuthority - Grails 2.4.2 和 Spring Security

Spring Security UI 和 grails 2.0

Grails 3 Spring Security 覆盖登录表单