我的应用程序中的一个控制器需要由针对外部数据库进行身份验证的用户访问。
我已经设置了自定义用户对象
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()为null,当我尝试访问应该在经过身份验证的用户对象上的externalId属性时返回空指针异常。
如果在我的CustomAuthenticationProvider中,我没有创建一个CustomUserDetails实例,而是使用GormUserDetailsService给我一个GrailsUser对象并使用它来构建令牌,控制器正常工作并且getCurrentUser()可以工作。
关于为什么这不起作用的任何想法?
答案 0 :(得分:0)
springSecurityService.getPrincipal()为我提供了我正在寻找的东西。
不确定为什么getCrincpal()会起作用时getCurrentUser()不起作用,但它就是这样。