我的应用程序中的一个控制器需要由针对外部数据库进行身份验证的用户访问。
我已经设置了一个自定义用户对象,
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
}
}
我在 Config.groovy 中创建了条目以将其添加到 springsecurity.providerNames 列表中,并将以下内容添加到 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() 为空,并且当我尝试访问应该在经过身份验证的用户对象上的 externalId 属性时返回空指针异常。
如果在我的 CustomAuthenticationProvider 中,我没有创建 CustomUserDetails 的实例,而是使用 GormUserDetailsService 给我一个 GrailsUser 对象并使用它来构建令牌,则控制器可以正常工作并且 getCurrentUser() 可以正常工作。
关于为什么这不起作用的任何想法?