【发布时间】:2017-12-25 15:23:01
【问题描述】:
我一直在尝试从这里实现 Facebook OAuth: http://alvarosanchez.github.io/grails-spring-security-rest/latest/docs/index.html#_delegating_authentication_to_oauth_providers
我能够集成 OAuth 并从 Facebook 获取访问令牌,但我在实现自定义 OAuthUserDetailsService 时遇到了问题。我创建了 定制服务:
FacebookOauthUserDetails.groovy
class FacebookOauthUserDetailsService implements OauthUserDetailsService{
@Delegate
UserDetailsService userDetailsService
UserDetailsChecker preAuthenticationChecks
@Override
OauthUser loadUserByUserProfile(CommonProfile userProfile, Collection<GrantedAuthority> defaultRoles) throws UsernameNotFoundException {
UserDetails userDetails
OauthUser oauthUser
println("adss")
try {
println("Trying to fetch user details for user profile: ${userProfile}")
userDetails = userDetailsService.loadUserByUsername(userProfile.id)
log.debug("Checking user details with ${preAuthenticationChecks.class.name}")
preAuthenticationChecks?.check(userDetails)
Collection<GrantedAuthority> allRoles = userDetails.authorities + defaultRoles
oauthUser = new OauthUser(userDetails.username, userDetails.password, allRoles, userProfile)
} catch (UsernameNotFoundException unfe) {
println("User not found. Creating a new one with default roles: ${defaultRoles}")
oauthUser = new OauthUser(userProfile.id, 'N/A', defaultRoles, userProfile)
}
return oauthUser
}
}
官方文档提到,为了覆盖默认行为,需要在 resources.groovy 中使用 bean 名称 oauthUserDetailsService 定义它。这就是我的 resources.groovy 文件的样子:
resources.groovy:
import hungr.FacebookOauthUserDetailsService
import hungr.UserPasswordEncoderListener
beans =
{
userPasswordEncoderListener(UserPasswordEncoderListener)
oauthUserDetailsService(FacebookOauthUserDetailsService)
}
我尝试在此处参考此文档以了解如何定义 bean: https://docs.grails.org/latest/guide/spring.html 但这对我也没有用。 我做错了什么?
【问题讨论】:
-
'userDetailsService' 可能无法正确注入/无法解析,您使用的是 grails3 吗?
-
是的,我正在使用 grails 3。
-
您是否发现了 null 问题以及为什么您的服务没有被注入?