8

Siteminder による preAuth に基づく春のセキュリティで 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 ヘッダーが要求に見つからないことを示していました。

そこで、「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 のスコープを「プロトタイプ」に変更することも検討してください。

4

1 に答える 1

2

誰かが興味を持っている場合 - 私はこの問題のいくつかの回避策を見つけました:

1. SiteMinder 管理者に、SM_USER ヘッダーをすべての画像または URL の場所に限定された画像のセットに追加するように依頼します。これは、一般的なパフォーマンスのため、デフォルトでは無効になっています。次に、すべての追加フィルターを緩めて、preAuth フィルターで幸せに暮らします。

2. .war とリダイレクトに画像を含める代わりに、静的コンテンツを使用します :]

方法:

必要なすべての画像を var/www/yourfolder/images に置きます httpd config にいくつかのエイリアスを追加します:

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

サービスを再起動してください 画像を使って幸せになりましょう :D

これが解決策ではなく、唯一の回避策であることは承知しています。それでも機能します。私はまだいくつかのより良いアイデアを聞いてうれしいです:)

乾杯。

于 2012-05-10T10:57:29.110 に答える