获取'无法在grails Spring安全性休息中调用null对象上的方法loadUserByUsername()'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取'无法在grails Spring安全性休息中调用null对象上的方法loadUserByUsername()'相关的知识,希望对你有一定的参考价值。
我一直在尝试从这里实施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)
}
我试图在这里引用这个doc如何定义一个bean:https://docs.grails.org/latest/guide/spring.html,但它对我来说也没有用。我究竟做错了什么?
GrailsUserDetailsService
的接口基本上位于org.springframework.security.core.userdetails
包中。您可以在服务(类)中实现上述服务(接口)的loadUserByUsername
方法并编写代码(实现)以获取所需的数据/用户详细信息,您可以将用户详细信息作为对象/列表/映射获得您想要的任何格式,你可以通过GORM finder方法通过给定的用户名找到数据并返回该数据。以下是示例示例,
服务代码:
class Your_service_name implements GrailsUserDetailsService {
Map loadUserByUsername(String username) throws UsernameNotFoundException {
Map userDetails = [:]
User.withTransaction { status ->
User user = User.findByUsername(username, ["readOnly": true])
if (!user) throw new UsernameNotFoundException('User not found', username)
// you can also return the whole user object here instead of map keep method return type as UserDetails and return user object, you also return the user roles along with other details in Map.
userDetails["username"] = user.username
userDetails["emailAddress"] = user.emailAddress
userDetails["userFullName"] = user.userFullName
return userDetails
}
}
现在,您可以在控制器中注入上述服务并调用以下方法,
class YourController{
Your_service_name myService // injected above created service which contains the loadUserByUsername method implementation
def getUserDetails(){
Map userdetails = myService.loadUserByUsername("username_to_find")
println userdetails
}
}
您的resources.groovy将如下,
beans = {
userDetailsService(Your_service_name)
}
注意:在此更改后清理并重新启动应用程序。
以上是关于获取'无法在grails Spring安全性休息中调用null对象上的方法loadUserByUsername()'的主要内容,如果未能解决你的问题,请参考以下文章
使用 grails spring security rest 插件登录时获取用户详细信息
在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架