2

Spring Security Grails プラグインを使用して PreAuthentication を実行しようとしています。以下に示す事前認証のドキュメントを読みましたが、私の状況に具体的なものは見つかりませんでした http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html

私の状況では、SAML リクエストを解析し、認証が成功した後にマップを提供するエージェントがあります。おすすめはこの瓶を使うことです。したがって、私は AbstractPreAuthenticatedProcessingFilter を拡張し、これを実行しようとしました

@Override 
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 
      userInfo = agent.readToken(request); 
        if (!userInfo){ 
             WebUtils.retrieveGrailsWebRequest().getCurrentResponse().sendRedirect(ssoUrl) 
        } 
        return userInfo 
}

myFilter を src/groovy の下に配置し、このフィルターを BootStrap に登録しました

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

正しく読み込まれていますが、フィルターがリダイレクトを発行していません。まず、これが正しいアプローチであるかどうか、正しい場合はリダイレクトを機能させる方法を確認したかったのです。

私はgrailsユーザーフォーラムで同じ質問をしました

どんな助けでも大歓迎です。

アップデート:

私のために働いた最終的な構成

提案どおりに AuthenticationUserDetailsS​​ervice を実装する MyAuthenticationService を作成しました。また、カスタム サービスをラップする preAuthenticatedAuthenticationProvider を定義する必要があります。

resources.groovy

securityFilter(MySSOAuthFilters){ bean ->
    authenticationManager = ref('authenticationManager')
    grailsApplication = ref('grailsApplication')
}

customUserDetailsService(MyAuthenticationService)

preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) {
    preAuthenticatedUserDetailsService = ref('customUserDetailsService')
}

<form-login>Grails では、これは相対 URL のみを受け入れる grails.plugins.springsecurity.auth.loginFormUrl 構成パラメーターを使用して行われるため、できませんでした。

私がやったことは、 grails.plugins.springsecurity.auth.loginFormUrl = '/login/index' です

In LoginController

def index() {
    if(springSecurityService.isLoggedIn()){
        log.info("User is logged in")
        return redirect(controller: 'mycontroller', action: 'list')
    }
    log.info("user is not logged in...redirect to sso.")
    return redirect(url: ssoUrl)
}

お役に立てれば

4

1 に答える 1

1

変更が必要なことがいくつかあります。

まず、事前認証フィルターでリダイレクトを送信しないでください。単にnullを返すだけです。preauthフィルターは、AuthenticationUserDetailsS​​erviceの実装で以下のメソッドを実装することにより、AuthenticationUserDetailsS​​erviceがUserDetailsオブジェクトを作成するために使用できるサブジェクトを返すためにのみ使用されます。

public UserDetails loadUserDetails(AbstractAuthenticationToken token) {
    return createUserFromSubject((Subject) token.getPrincipal());
}

次に、構成の一部としてフォームログインページを設定します。これは、サブジェクトが存在しない場合にリダイレクトするために使用されます。

<form-login login-page="http://url_youwanttoredirect_to_on_auth_req" authentication-failure-url="http://url_youwanttoredirect_to_on_auth_req"/>
于 2013-02-05T17:12:53.590 に答える