アプリ内の 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 のインスタンスを作成する代わりに、GormUserDetailsService を使用して GrailsUser オブジェクトを提供し、それを使用してトークンを作成すると、コントローラーは正常に動作し、getCurrentUser() は動作します。
これが機能しない理由についてのアイデアはありますか?