Grails spring安全rest-覆盖令牌

Grails spring安全rest-覆盖令牌,grails,spring-security,Grails,Spring Security,我在为已经拥有令牌的用户覆盖数据库中的令牌时遇到问题。 问题:对api/v1/login的POST请求会在JSON响应中生成新的令牌,但我收到的新生成的令牌不会存储在数据库中。如果我们已经为该用户提供了令牌,则旧令牌会一直保留,直到Quartz作业将其移除 如果用户再次登录,我希望用户收到一个新的令牌(并将其存储起来)。我们需要更多详细信息来帮助您:您需要插件配置、安全过滤器等 我建议您将令牌保存在缓存中,而不是像指定的那样保存在数据库中。很好的建议,如果GORM实现看起来不可能,我会尝试。 也

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


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

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


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

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

您的AuthenticationToken上可能有一个限制,阻止将新令牌保存在数据库中

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

如果您对username有唯一的约束,或者在未填充的令牌类中添加了一些其他非null属性,则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()
        }
void storeToken(字符串tokenValue,UserDetails主体){
dc.withTransaction{状态->
def newTokenObject=dc.newInstance((tokenValuePropertyName):tokenValue,(usernamePropertyName):principal.username)
newTokenObject.save()
}
没有检查令牌是否成功保存