Spring Security запомнить меня не работает должным образом, таблица базы данных не работает должным образом
После настройки защиты от Spring вспомните меня (подход Persistent Token), данные пользователя сохраняются в базе данных (таблица "persistent_token"). И я вижу "SPRING_SECURITY_REMEMBER_ME_COOKIE" в моем браузере. После перезапуска сервера я обновляю свой, и тот же пользователь вошел в систему. Но, хотя тот же пользователь снова вошел в систему, его данные должны быть обновлены. Но он не обновляется, он вставляется в базу данных. Итак, один пользователь имеет несколько значений в этой таблице. моя applicationSecurity.xml есть,
<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>
Мой класс сущности,
@Entity
@Table(name = "persistent_logins")
public class RememberMeToken implements Serializable {
@Column(name = "username")
private String username;
@Id
@Column(name = "series")
private String series;
@Column(name = "token")
private String token;
@Column(name = "last_used")
@Temporal(javax.persistence.TemporalType.DATE)
private Date date;
public RememberMeToken(){
}
public RememberMeToken(PersistentRememberMeToken token)
{
this.username = token.getUsername();
this.series = token.getSeries();
this.token = token.getTokenValue();
this.date = token.getDate();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSeries() {
return series;
}
public void setSeries(String series) {
this.series = series;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
реализация 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);
}
}
1 ответ
Я думаю, что вам не хватает задавать уникальные атрибуты имени пользователя и токена, то есть вы можете гарантировать, что будет вставлена только уникальная строка, или же, если значение обновлено, и вы также можете проверить метод createNewToken(), если электронная почта уже вставлен и если адрес электронной почты отсутствует, то только вы можете вставить эту строку, таким образом, вы получите одну строку для одного электронного письма, надеюсь, это поможет вам, с уважением!