Grails spring安全休息 - 覆盖令牌

时间:2015-02-23 11:28:26

标签: grails spring-security

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

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

3 个答案:

答案 0 :(得分:0)

我们需要更多详细信息来帮助您:插件配置,安全过滤器等。

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

答案 1 :(得分:0)

很好的建议,如果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

答案 2 :(得分:0)

您的AuthenticationToken可能有一个约束,阻止新令牌保存在数据库中。

执行另一次登录不会替换现有令牌,但会尝试向AuthenticationToken表添加新条目。

如果您对用户名具有唯一约束,或者某个其他非空属性已添加到未填充的令牌类中,则对save的调用将失败,并且不会在任何位置记录任何警告。

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

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

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