0

アプリ内の 1 つのコントローラーは、外部データベースに対して認証されたユーザーがアクセスできる必要があります。

カスタム ユーザー オブジェクトをセットアップしました。

class CustomUserDetails extends GrailsUser {

    final String externalId

    CustomUserDetails(String username, String password, boolean enabled,
        boolean accountNonExpired, boolean credentialsNonExpired,
        boolean accountNonLocked,
        Collection<GrantedAuthority> authorities,
        long id, String externalId) {

        super(username, password, enabled, accountNonExpired,
        credentialsNonExpired, accountNonLocked, authorities, id)

        this.externalId = externalId 
    }       
}

およびカスタム AuthenticationProvider

class CustomAuthenticationProvider implements AuthenticationProvider {
    def springSecurityService

    Authentication authenticate(Authentication customAuth) {

    /* Do stuff to validate the user's credentials here */

        def userDetails = new CustomUserDetails(customAuth.getPrincipal(), customAuth.getCredentials(), true, true, true, true, 
                [new GrantedAuthorityImpl('ROLE_SPECIAL_USER')], 9999999, "externalDatabaseIdString")

        def token = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.authorities)

        return token
    }

    boolean supports(Class authentication) {
        return true
    }
}

これをspringsecurity.providerNamesリストに追加するためにConfig.groovyにエントリを作成し、次をconf/spring/resources.groovyに追加しました

beans = {
customAuthenticationProvider(info.proadvisors.auth.CustomAuthenticationProvider){ bean ->   bean.autowire = "byName" }

userDetailsService(org.codehaus.groovy.grails.plugins.springsecurity.GormUserDetailsService){ bean -> bean.autowire = "byName" }
}

ここに問題があります-私のコントローラーでは、springSecurityService が注入されていますが、springSecurityService.getCurrentUser() は null であり、認証されたユーザー オブジェクトにあるはずの externalId プロパティにアクセスしようとすると、null ポインター例外が返されます。

CustomAuthenticationProvider で、CustomUserDetails のインスタンスを作成する代わりに、GormUserDetailsS​​ervice を使用して GrailsUser オブジェクトを提供し、それを使用してトークンを作成すると、コントローラーは正常に動作し、getCurrentUser() は動作します。

これが機能しない理由についてのアイデアはありますか?

4

1 に答える 1

0

springSecurityService.getPrincipal() は、探しているものを提供してくれます。

getPrincpal() が機能しているのに getCurrentUser() が機能しない理由はわかりませんが、それはそれです。

于 2012-05-27T23:54:09.813 に答える