【问题标题】:Getting 'Cannot invoke method loadUserByUsername() on null object' in grails spring security rest在grails spring security rest中获取'无法在空对象上调用方法loadUserByUsername()'
【发布时间】: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 获取访问令牌,但我在实现自定义 OAuthUserDetailsS​​ervice 时遇到了问题。我创建了 定制服务:

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 名称 oauthUserDetailsS​​ervice 定义它。这就是我的 resources.groovy 文件的样子:

resources.groovy

import hungr.FacebookOauthUserDetailsService
import hungr.UserPasswordEncoderListener

beans =
{
    userPasswordEncoderListener(UserPasswordEncoderListener)
    oauthUserDetailsService(FacebookOauthUserDetailsService)
}

我尝试在此处参考此文档以了解如何定义 bean: https://docs.grails.org/latest/guide/spring.html 但这对我也没有用。 我做错了什么?

【问题讨论】:

  • 'userDetailsS​​ervice' 可能无法正确注入/无法解析,您使用的是 grails3 吗?
  • 是的,我正在使用 grails 3。
  • 您是否发现了 null 问题以及为什么您的服务没有被注入?

标签: grails spring-security


【解决方案1】:

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)
}

注意:在此更改后清理并重新启动您的应用程序。

【讨论】:

  • 这里的官方文档 (alvarosanchez.github.io/grails-spring-security-rest/latest/docs/…) 说我需要实现 OAuthUserDetailsS​​ervice 接口才能覆盖默认行为。对不起,如果我很傻。我是新手,我对 groovy/grails 的了解相当有限。互联网上可用的有限资源也无助于我的事业。
  • @AdityaGurjar:请参阅我已使用示例代码更新了答案,希望对您有所帮助。
  • 我创建了实现 GrailsUserDetailsS​​ervice 的自定义服务。我仍然面临同样的问题。我觉得我在 resources.groovy 文件中定义 bean 时做错了。
  • 我建议你去Grails社区的github上的示例Grails项目,搜索如何创建bean,希望docs和github项目对你有所帮助。
  • 在 grails rest 中没有可用于 Oauth 的示例项目。只是文档。
猜你喜欢
  • 2016-11-14
  • 2018-12-10
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2015-02-16
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多