【发布时间】:2017-07-31 01:13:02
【问题描述】:
我在为已拥有令牌的用户覆盖数据库中的令牌时遇到问题。 问题:对 api/v1/login 的 POST 请求在 JSON 响应中生成新令牌,但如果我们已经有该用户的令牌,我收到的新生成的令牌不会存储在数据库中,旧令牌会一直保留到 Quartz 作业删除它。
如果用户再次登录,我希望用户会收到一个新令牌(并存储它)。
【问题讨论】:
我在为已拥有令牌的用户覆盖数据库中的令牌时遇到问题。 问题:对 api/v1/login 的 POST 请求在 JSON 响应中生成新令牌,但如果我们已经有该用户的令牌,我收到的新生成的令牌不会存储在数据库中,旧令牌会一直保留到 Quartz 作业删除它。
如果用户再次登录,我希望用户会收到一个新令牌(并存储它)。
【问题讨论】:
我们需要更多详细信息来帮助您解决这个问题:您的插件配置、安全过滤器等。
我建议您将令牌保存在 缓存 中,而不是像 documentation 指定的那样保存在数据库中。
【讨论】:
很好的建议,如果 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 表中。
如果您对用户名有唯一约束,或者添加到您的令牌类但未填充的其他非空属性,则保存调用将失败,并且不会在任何地方记录任何警告。
您可以在 GormTokenStorageService.groovy 的第 65 行附近看到这一点。
void storeToken(String tokenValue, UserDetails principal) {
<snip>
dc.withTransaction { status ->
def newTokenObject = dc.newInstance((tokenValuePropertyName): tokenValue, (usernamePropertyName): principal.username)
newTokenObject.save()
}
没有检查令牌是否保存成功。
【讨论】: