2015-03-26 2 views
1

После настройки весенней безопасности помните меня (подход 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); 
} 

}

ответ

0

Я думаю, что вам не хватает атрибутов имени пользователя и токена, то есть вы можете убедиться, что вставлена ​​только уникальная строка, или если значение обновлено, и вы также можете проверить метод createNewToken(), если это письмо уже вставлен, и если письмо отсутствует, тогда вы можете вставить эту строку, так что вы получите одну строку для одного электронного письма, надеюсь, это поможет вам!