当前位置: 首页 > 知识库问答 >
问题:

在使用Member Me Check登录之前,如何使用spring security更新grails中用户的详细信息?

能向晨
2023-03-14

我正在使用grails,其中授权由Spring Security完成。我需要在登录之前解锁用户帐户

@Transactional(readOnly=true, noRollbackFor=[IllegalArgumentException, UsernameNotFoundException])

用户详细信息loadUserByUsername(字符串用户名)抛出UsernameNotFoundException{

  User user = User.findByUsername(username)
  // Check and unlock account if 24 Hrs has been passed
  userService.checkAndUnlockAccountAfter24Hrs(user.id);
  if (!user) throw new NoStackUsernameNotFoundException()

  def roles = user.authorities

  // or if you are using role groups:
  // def roles = user.authorities.collect { it.authorities }.flatten().unique()

  def authorities = roles.collect {
     new SimpleGrantedAuthority(it.authority)
  }

  return new MyUserDetails(user.username, user.password, user.enabled,
        !user.accountExpired, !user.passwordExpired,
        !user.accountLocked, authorities ?: NO_ROLES, user.id,
        user.name)

}

现在,当我使用“记住我”检查登录时,它会显示错误:

- 

    | Error 2017-04-18 12:24:40,426 [http-bio-8080-exec-3] ERROR
       [/].[default]  - Servlet.service() for servlet [default] in context
       with path [] threw exception
           Message: retrieveUser returned null - a violation of the interface contract
               Line | Method
           ->>   76 | attemptAuthentication in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
           - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
           |     49 | doFilter              in     ''
           |     82 | doFilter . . . . . .  in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
           |    100 | doFilter              in com.brandseye.cors.CorsFilter
           |   1145 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor
           |    615 | run                   in java.util.concurrent.ThreadPoolExecutor$Worker
           ^    744 | run . . . . . . . . . in java.lang.Thread

共有1个答案

金高轩
2023-03-14

您有三种选择:

  1. 在每次运行中注释掉boostrap中的代码;除了第一次

使用如下条件(三元运算符):

def adminRole = Role.findByAuthority('ROLE_ADMIN') ? : new Role(authority: 'ROLE_ADMIN').save(flush: true)
def userRole = Role.findByAuthority('ROLE_USER') ? : new Role(authority: 'ROLE_USER').save(flush: true)

def adminUser = User.findByUsername('admin') ? : new User(username: 'admin', password: 'admin', enabled: true).save(flush: true)
def user = User.findByUsername('user') ? : new User(username: 'user', password: 'user', enabled: true).save(flush: true)

if (!adminUser.authorities.contains('ROLE_ADMIN')) {
  UserRole.create(adminUser, adminRole)
}
if (!user.authorities.contains('ROLE_USER')) {
  UserRole.create(user, userRole)
}
 类似资料:
  • 目前,我正在使用以下内容将用户登录到我的应用程序中。然而,我想使用一个角函数来实际执行登录。为此,我想创建一个Rest网络服务来进行身份验证,但是我在SO上看到的所有示例都使用我认为被贬低的用户。我还希望该服务返回有关用户的信息。 我要问的是如何将MyUserDetailsService更改为用作登录的restful服务,或者如何创建一个可用于登录的服务,该服务将在登录后返回用户对象。 这是我的a

  • 我正在使用spring security的spring boot 2.2.4。我面临的问题是,每次我与新用户登录时,主要用户名都会重置为新登录用户的详细信息,为什么。然而,正如我所观察到的,会话ID仍然正确。我不理解这种行为。知道吗? 用户详情服务 UserDetails类

  • 如何使用Keycloak restendpoint获取用户在Keycloak中的最后登录会话详细信息?

  • X1.0新增 sp_update_current_user($user) 功能: 更新session里当前登录用户的信息 参数: $user:当前登录用户的最新信息 返回: 无

  • 我已经使用Spring Security实现了更改密码功能,但((User细节)主体). getPassword())为登录用户返回null。 如果我没记错的话,这曾经在3.0的早期工作过。这在3.1中是否进行了更改,以便无法检索登录用户的当前密码? 在下面的代码中,我检查从网页输入的用户密码中的当前密码。然后我检查登录用户的密码是否与输入的密码匹配。如果是,那么我想设置oldPasswordMa

  • 我是Zapi(Zephyr API)的新手。我正在尝试评估Zapi API以实现自动测试用例结果更新。在尝试使用它获取有关测试用例的详细信息时,我在控制台上收到了“请登录”消息。我正在尝试从以下链接使用Zapi Rest API:http://docs.getzephyr.apiary.io/. 下面是我用来获取特定测试用例详细信息的代码: 我在控制台上收到以下消息: 请让我知道,我在这里缺少什么