【问题标题】:Grails spring security rest - overwrite tokenGrails spring security rest - 覆盖令牌
【发布时间】:2017-07-31 01:13:02
【问题描述】:

我在为已拥有令牌的用户覆盖数据库中的令牌时遇到问题。 问题:对 api/v1/login 的 POST 请求在 JSON 响应中生成新令牌,但如果我们已经有该用户的令牌,我收到的新生成的令牌不会存储在数据库中,旧令牌会一直保留到 Quartz 作业删除它。

如果用户再次登录,我希望用户会收到一个新令牌(并存储它)。

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

    我们需要更多详细信息来帮助您解决这个问题:您的插件配置、安全过滤器等。

    我建议您将令牌保存在 缓存 中,而不是像 documentation 指定的那样保存在数据库中。

    【讨论】:

      【解决方案2】:

      很好的建议,如果 GORM 实现似乎不可能,我会尝试。 也许它只是一个配置参数?我搜索了文档,但没有找到任何东西。

      Config.groovy:

      grails.plugin.springsecurity.filterChain.chainMap = [
      '/api/v1/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter',
      grails.plugin.springsecurity.rest.token.validation.useBearerToken = false
      grails.plugin.springsecurity.rest.token.validation.headerName = 'X-Auth-Token'
      grails.plugin.springsecurity.rest.login.endpointUrl = '/api/v1/login'
      grails.plugin.springsecurity.rest.token.storage.useGorm = true
      grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = 'backend.auth.AuthenticationToken'
      grails.plugin.springsecurity.rest.token.storage.gorm.tokenValuePropertyName = 'token'
      grails.plugin.springsecurity.rest.token.storage.gorm.usernamePropertyName = 'username'
      grails.plugin.springsecurity.rest.login.passwordPropertyName = 'password'
      grails.plugin.springsecurity.rest.login.useJsonCredentials = true
      grails.plugin.springsecurity.rest.login.useRequestParamsCredentials = false
      

      【讨论】:

        【解决方案3】:

        您的 AuthenticationToken 可能有一个约束,导致新令牌无法保存在数据库中。

        再次登录不会替换现有令牌,但会尝试将新条目添加到 AuthenticationToken 表中。

        如果您对用户名有唯一约束,或者添加到您的令牌类但未填充的其他非空属性,则保存调用将失败,并且不会在任何地方记录任何警告。

        您可以在 GormTokenStorageService.groovy 的第 65 行附近看到这一点。

        void storeToken(String tokenValue, UserDetails principal) {   
        <snip>
            dc.withTransaction { status ->
                    def newTokenObject = dc.newInstance((tokenValuePropertyName): tokenValue, (usernamePropertyName): principal.username)
                    newTokenObject.save()
                }
        

        没有检查令牌是否保存成功。

        【讨论】:

          猜你喜欢
          • 2018-01-11
          • 2015-12-20
          • 2014-10-02
          • 2016-05-16
          • 2019-05-09
          • 1970-01-01
          • 2015-05-04
          • 2014-11-02
          • 2015-09-19
          相关资源
          最近更新 更多