Spring Boot / Spring Security,我已启用“记住我”。它可以正确设置2周(默认长度)的cookie。我也有持久性,它可以将数据正确保存到数据库中。
我可以重新启动应用程序,并且会话将保持活动状态。 Cookie和数据库运行良好。
我在日志中收到此错误:
错误org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices [http-nio-2058-exec-51]无法保存持久令牌 org.springframework.dao.DuplicateKeyException:PreparedStatementCallback; SQL [插入persistent_logins(用户名,系列,令牌,last_used)值(?,?,?,?));密钥“ PRIMARY”的条目“ username ”重复;嵌套的异常是java.sql.SQLIntegrityConstraintViolationException:密钥“ PRIMARY”的重复条目“ 用户名”
这是由于用户在两个不同的设备上两次登录。我需要在多个设备上支持“记住我”。
有什么办法解决这个问题吗?
答案 0 :(得分:0)
如果我没有记错的话(至少2年没有使用RememberMe),那么这不是一个必要的选择-保留记住我的令牌。您有一个编码器,盐,您可以检查它而无需将令牌保存到DB中,例如,在安全过滤器中-这是最简单,可靠和快速的解决方案。 RememberMe的安全优先级不是最高。
但是,如果您希望保留“记住我”令牌的任何内容,是什么阻止您更改“ persistent_logins”实体? RememberMe可与http会话/ cookie配合使用,因此您始终可以访问IP。使其成为主键。
如果您想提高流程的通用性,请添加一些唯一的标识符(例如UUID),然后将其放入带有令牌的cookie中。在这种情况下,即使用户将通过一个IP拥有会话,但使用不同的浏览器,其会话也将是唯一的。