【问题标题】:Spring security remember-me not working properly, database table is not working properlySpring security remember-me 无法正常工作,数据库表无法正常工作
【发布时间】:2015-03-26 06:13:23
【问题描述】:

设置spring security之后记住我(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);
}

}

【问题讨论】:

    标签: java spring-mvc spring-security remember-me


    【解决方案1】:

    我认为你缺少给用户名和令牌唯一属性,这是你可以确保只插入唯一行或者如果值被更新的方式,你也可以检查 createNewToken() 方法如果电子邮件已插入,如果电子邮件不存在,则只有您可以插入该行,这样您将获得单个电子邮件的单行,希望这对您有所帮助,问候!

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 2017-04-29
      • 2020-02-09
      • 2021-09-20
      • 2013-05-06
      • 2017-03-05
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      相关资源
      最近更新 更多