1

Spring Security Core を使用して、事前認証済みのシナリオで Grails アプリを構成しようとしています。

そこで、カスタム認証フィルターを作成しました。

class MyAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
    protected getPreAuthenticatedPrincipal(request) { "my_username" }
    protected getPreAuthenticatedCredentials(request) { "N/A" }
}

それを春に追加しました:

beans = {
    myAuthenticationFilter(MyAuthenticationFilter) {
        authenticationManager = ref('authenticationManager')
        checkForPrincipalChanges = true
    }
}

位置 PRE_AUTH_FILTER で BootStrap に登録しました。

class BootStrap {
    def init = { servletContext ->
        SpringSecurityUtils.clientRegisterFilter('myAuthenticationFilter',
            SecurityFilterPosition.PRE_AUTH_FILTER.order)
    }
}

Config.groovy には、標準の User、Role、および UserRole クラス名といくつかの staticRules しかありません。

フィルター内で、そのgetPreAuthenticatedPrincipal()メソッドからあらゆる種類のものを返そうとしました: ユーザー ID、文字列としてのユーザー ID、そのユーザー名、ユーザー オブジェクト自体… リクエストごとにフィルターが呼び出されていることがわかります (これは私は、checkForPrincipalChanges = true) を設定した後、何を返しても、現在のユーザーは匿名のままですspringSecurityService.principal__grails.anonymous.user__

ユーザーを既存のグループとロールで認証できるようにするには、セットアップで何を変更する必要がありますか? 追加の認証プロバイダーを書きたくありません。Grails の標準で問題ありませんdaoAuthenticationProvider。フィルターから特定のものを返す必要がありますか? 他のSpringクラスをセットアップする必要がありますか?

4

1 に答える 1

2

私はそれを解決しました。他の誰かが同じことをする必要がある場合に備えて、ここに文書化しています。

基本的に欠けていたのは、新しい PreAuthenticatedAuthenticationProvider を唯一のプロバイダーとして構成することでした。追加のコードは必要ありません。リソースで定義するだけです。

myAuthenticationProvider(PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService = ref('authenticationUserDetailsService')
}

Config で唯一のプロバイダーとして設定します。

grails.plugin.pringsecurity.providerNames = ['myAuthenticationProvider']

次に、認証フィルターから、事前認証されたユーザーのユーザー名を返すか、存在しない場合は null (匿名ユーザー) を返します。

于 2014-09-25T17:59:50.200 に答える