2012-05-03 31 views
6

我試圖通過Siteminder基於preAuth來保護我的grails應用程序和Spring安全性。這基本上是我需要的。該應用程序僅用於檢查某些內容,因此不需要數據庫。Grails,Spring Security&Siteminder - 資源問題或用戶詳細問題

我被困在一些過濾器問題,我無法接受。

起初我只用了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) 
    } 
} 

我在每一個明智的教程還配置固定的網址,如:

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的範圍改爲'原型'。

回答

2

如果任何人的興趣 - 我發現這個問題的一些解決方法:

提出的SiteMinder管理員SM_USER頭添加到所有圖像或某一組人僅限於URL位置。由於一般性能,這在默認情況下是禁用的。然後鬆開所有額外的過濾器,然後過上preAuth之後過上幸福的生活。

2.使用靜態內容,而不是包括的.war圖片和重定向:]

HOW TO:

把所有需要的圖像無功/網絡/ yourfolder /圖像 添加一些別名你的httpd配置:

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

重新啓動服務 要快樂使用圖片:d

我知道這不是解決方案,而只是解決方法。但它有效。 我會很高興聽到一些更好的想法:)

乾杯。