gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:52:10 28 4
gpt4 key购买 nike

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

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

起初我只使用了 RequestHeaderAuthenticationFilter 和自定义的 UserDetails 和 UserDetailsS​​ervice。

我的 Spring Bean :

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 header 。

所以我认为我可以使用一些解决方案,比如“过滤器:无”或“安全:无”,这样 spring 就可以知道哪些 url 请求允许,而无需检查 SM_USER。

我尝试向过滤器和过滤器链添加东西:
grails.plugins.springsecurity.filterNames = ['requestHeaderAuthenticationFilter']

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

但这没有帮助。

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

所以我做了一些改变:
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'
]

是的,这有助于图像。但另一个问题开始出现。

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

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

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

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

谢谢 !!!

//编辑:如果有任何人使用此作为引用来设置站点管理员 sso 的安全性,请注意添加:
checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'

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

最佳答案

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

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

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

如何:

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

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

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

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

干杯。

关于Grails、Spring Security 和 Siteminder - 资源或用户详情问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435242/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com