Java Spring security记住我工作不正常,数据库表工作不正常
在设置SpringSecurityMemberMe(持久令牌方法)之后,用户的数据存储到数据库(“持久令牌”表)中。我可以在浏览器中看到“SPRING\u SECURITY\u Memory\u ME\u COOKIE”。重新启动服务器后,我刷新我的,同一个用户登录。但是,当同一用户再次登录时,他的数据应该更新。但是,它并没有被更新,而是被插入到数据库中。因此,一个用户在该表中有多个值。 我的applicationSecurity.xml是Java Spring security记住我工作不正常,数据库表工作不正常,java,spring-mvc,spring-security,remember-me,Java,Spring Mvc,Spring Security,Remember Me,在设置SpringSecurityMemberMe(持久令牌方法)之后,用户的数据存储到数据库(“持久令牌”表)中。我可以在浏览器中看到“SPRING\u SECURITY\u Memory\u ME\u COOKIE”。重新启动服务器后,我刷新我的,同一个用户登录。但是,当同一用户再次登录时,他的数据应该更新。但是,它并没有被更新,而是被插入到数据库中。因此,一个用户在该表中有多个值。 我的applicationSecurity.xml是 <security:http auto-con
<security:http auto-config="true" use-expressions="true">
<security:intercept-url pattern="/admin" access="hasRole('ADMINISTRATOR')" />
<security:intercept-url pattern="/welcome" access="isAuthenticated()" />
<security:remember-me
token-validity-seconds = "1209600"
data-source-ref = "dataSource"/>
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource"
</security:authentication-provider>
</security:authentication-manager>
}
实现PersistentTokenRepository
@Repository
public class PersistentTokenRepositoryImpl implements PersistentTokenRepository{
@Autowired
private RememberMeTokenRepository rememberMeTokenRepository;
@Override
public void createNewToken(PersistentRememberMeToken token) {
RememberMeToken newToken = new RememberMeToken(token);
this.rememberMeTokenRepository.save(newToken);
}
@Override
public void updateToken(String series, String tokenValue, Date lastUsed) {
RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
if(token != null)
{
token.setToken(tokenValue);
token.setDate(lastUsed);
}
}
@Override
public PersistentRememberMeToken getTokenForSeries(String series) {
RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
return new PersistentRememberMeToken(token.getUsername(),token.getSeries(),token.getToken(),token.getDate());
}
@Override
public void removeUserTokens(String userName) {
Iterable<RememberMeToken> tokens = this.rememberMeTokenRepository.findByUserName(userName);
this.rememberMeTokenRepository.delete(tokens);
}
@存储库
公共类PersistentTokenRepositoryImpl实现PersistentTokenRepository{
@自动连线
私有RememberMetakenRepository RememberMetakenRepository;
@凌驾
public void createNewToken(persistentermembermetoken令牌){
RememberMeToken newToken=新的RememberMeToken(令牌);
这个.rememberTokenRepository.save(newToken);
}
@凌驾
public void updateToken(字符串系列、字符串标记值、上次使用日期){
RememberMeToken-token=this.RememberMeToken-repository.findBySeries(系列);
if(令牌!=null)
{
token.setToken(tokenValue);
token.setDate(上次使用);
}
}
@凌驾
公共持久化EnterMemberMetoken GetToken信息系列(字符串系列){
RememberMeToken-token=this.RememberMeToken-repository.findBySeries(系列);
返回新的PersistEnterMemberMetoken(token.getUsername()、token.getSeries()、token.getToken()、token.getDate());
}
@凌驾
public void removeUserTokens(字符串用户名){
Iterable tokens=this.rememberMeTokenRepository.findByUserName(用户名);
this.rememberMeTokenRepository.delete(令牌);
}
}我认为您没有提供用户名和令牌的唯一属性,这是一种确保仅插入唯一行的方法,或者如果值已更新,您还可以检查createNewToken()方法,如果电子邮件已插入,并且如果电子邮件不存在,则只有您可以插入该行,这样你就可以收到一行一封的电子邮件,希望这会对你有所帮助,谢谢
@Repository
public class PersistentTokenRepositoryImpl implements PersistentTokenRepository{
@Autowired
private RememberMeTokenRepository rememberMeTokenRepository;
@Override
public void createNewToken(PersistentRememberMeToken token) {
RememberMeToken newToken = new RememberMeToken(token);
this.rememberMeTokenRepository.save(newToken);
}
@Override
public void updateToken(String series, String tokenValue, Date lastUsed) {
RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
if(token != null)
{
token.setToken(tokenValue);
token.setDate(lastUsed);
}
}
@Override
public PersistentRememberMeToken getTokenForSeries(String series) {
RememberMeToken token = this.rememberMeTokenRepository.findBySeries(series);
return new PersistentRememberMeToken(token.getUsername(),token.getSeries(),token.getToken(),token.getDate());
}
@Override
public void removeUserTokens(String userName) {
Iterable<RememberMeToken> tokens = this.rememberMeTokenRepository.findByUserName(userName);
this.rememberMeTokenRepository.delete(tokens);
}