我試圖通過Siteminder基於preAuth來保護我的grails應用程序和Spring安全性。這基本上是我需要的。該應用程序僅用於檢查某些內容,因此不需要數據庫。Grails,Spring Security&Siteminder - 資源問題或用戶詳細問題
我被困在一些過濾器問題,我無法接受。
起初我只用了RequestHeaderAuthenticationFilter和自定義UserDetails和UserDetailsService。
我的春豆:
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)
}
}
我在每一個明智的教程還配置固定的網址,如:
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頭。
所以我認爲我可以使用一些解決方案,比如'filters:none'或者'security:none',這樣spring會知道什麼是url請求而不檢查SM_USER。
我嘗試添加的東西過濾和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'
]
YAY,有助於爲圖像。但是另一個問題開始出現。
而不是當auth正確時應該返回的myUserDetails對象我正在頻繁地獲取一些String對象。而且我的應用程序無法在此String對象中找到一個屬性(這很明顯,因爲它不在那裏;))
有沒有人知道如何處理該問題?從顯示圖像辭職是不是一個選項;)
是否有某種方式來排除圖像/其他資源在春季安全grails配置filterchain ...?就像它以普通的Java .xml方式完成的一樣......?
我會感謝所有的幫助和建議如何解決這個問題。
謝謝!
//編輯:萬一有人是使用這個作爲參考,以建立安全SiteMinder的SSO請注意添加:
checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'
屬性您requestHeaderAuthenticationFilter。否則,在調用springSecurityService.getPrincipal()時,您將在http會話中處理未更新的Authority會話,因此用戶可能「以其他人身份登錄」。 :)也考慮將你的bean的範圍改爲'原型'。