2015-02-23 105 views
1

我有问题覆盖已有令牌的用户在数据库中的标记。 问题:对api/v1/login的POST请求会在JSON响应中生成新的令牌,但如果我们已经为该用户拥有令牌,则接收到的新生成的令牌不会存储在数据库中,旧的令牌会一直保留到Quartz作业去掉它。Grails弹簧安全休息 - 覆盖标记

如果用户再次登录,我希望用户可以接收新的令牌(并将其存储)。

回答

0

我们需要更多的细节来帮助你在这:你插件配置,安全过滤器等

我建议你保存令牌缓存而不是在像documentation指定数据库。

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 
0

你可能对你的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() 
     } 

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