我遇到了在数据库中为已经拥有令牌的用户覆盖令牌的问题。 问题:对api / v1 / login的POST请求在JSON响应中生成新令牌,但是如果我们已经为该用户提供了令牌,则我收到的新生成的令牌不存储在数据库中,旧令牌一直保留到Quartz作业删除它
如果用户再次登录,我希望用户收到一个新令牌(并存储它)。
答案 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()
}
没有检查令牌是否成功保存。