Siteminder による preAuth に基づく春のセキュリティで grails アプリケーションを保護しようとしています。基本的に必要なのはそれだけです。アプリケーションは、いくつかのものをチェックするためだけに使用されるため、データベースは必要ありません。
どういうわけか受け入れることができないいくつかのフィルターの問題で立ち往生しています。
最初は、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)
}
}
また、すべての賢明なチュートリアルのように、保護された 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 ヘッダーが要求に見つからないことを示していました。
そこで、「filters: none」や「security: none」などのソリューションを使用して、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'
]
画像に役立ちました。しかし、別の問題が発生し始めました。
認証が正しい場合に返されるはずの myUserDetails オブジェクトの代わりに、いくつかの String オブジェクトを頻繁に取得しています。そして、私のアプリは、この String オブジェクトで 1 つのプロパティを見つけることができないために失敗しています (そこにないため、これは非常に明白です;))
誰もその問題に対処する方法を知っていますか? 画像の表示をやめるという選択肢はありません ;)
spring security grails 構成でフィルターチェーンから画像/その他のリソースを除外する方法はありますか? 通常の Java .xml の方法で行われたのと同じように...?
これを解決するためのすべてのヘルプと提案に感謝します。
ありがとう !!!
//編集:万一誰かがこれをリファレンスとして使用して、siteminder sso のセキュリティを設定する場合は、以下を追加してください:
checkForPrincipalChanges = 'true'
invalidateSessionOnPrincipalChange = 'true'
プロパティを requestHeaderAuthenticationFilter に追加します。そうしないと、springSecurityService.getPrincipal() を呼び出すときに http セッションで更新されていない権限を処理することになり、ユーザーが「別のユーザーとしてログイン」する可能性があります。:) Bean のスコープを「プロトタイプ」に変更することも検討してください。