Spring Security 학습 의 remembeMe 자동 로그 인 실현
10982 단어 springsecurityrememberme
자동 로그 인 은 사용자 의 로그 인 정 보 를 사용자 브 라 우 저의 쿠키 에 저장 하고 사용자 가 다음 에 방문 할 때 자동 으로 검 사 를 실현 하고 로그 인 상 태 를 구축 하 는 메커니즘 입 니 다.
Spring Security 는 두 가지 아주 좋 은 토 큰 을 제공 합 니 다.
해시 암호 화 방안
Spring Security 에 자동 로그 인 기능 을 추가 하 는 것 은 매우 간단 합 니 다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/user/**").hasRole("user") //user /api/user/
.antMatchers("/api/admin/**").hasRole("admin") //admin /api/admin/
.antMatchers("/api/public/**").permitAll() // /api/public/
.and()
.formLogin()
.and()
.rememberMe().userDetailsService(userDetailsService()); //
}
서 비 스 를 다시 시작 한 후 제 한 된 API 에 접근 합 니 다.이번 에는 폼 로그 인 페이지 에 선택 가능 한 상자 가 하나 더 생 겼 습 니 다."Remember me on this computer"옵션 상 자 를 선택 하고 정상 적 인 절차 에 따라 로그 인하 고 개발 자 도구 에서 브 라 우 저 쿠키 를 보면 JSESSIONID 를 제외 한 값 이 하나 더 있 음 을 볼 수 있 습 니 다.
Spring Security 의 기본 자동 로그 인 쿠키 필드 입 니 다.설정 하지 않 은 상태 에서 만 료 시간 은 2 주일 입 니 다.
Spring Security 는 매번 폼 로그 인 에 성공 한 후에 이 토 큰 을 업데이트 합 니 다.구체 적 인 처리 방식 은 원본 코드 에 있 습 니 다.
RememberConfigurer:
영구 화 토 큰 방안
영구 화 토 큰 방안 에서 가장 핵심 적 인 것 은 series 와 token 두 값 입 니 다.모두 MD5 로 산 열 된 무 작위 문자열 입 니 다.다른 것 은 series 는 사용자 가 비밀 번 호 를 사용 하여 다시 로그 인 할 때 만 업데이트 되 고 token 은 모든 새로운 session 에서 다시 생 성 됩 니 다.
해시 암호 화 방안 의 토 큰 이 여러 단 에 동시에 로그 인 할 수 있 는 문 제 를 해결 하 였 습 니 다.모든 세 션 은 token 의 업 데 이 트 를 가 져 옵 니 다.즉,모든 token 은 하나의 인 스 턴 스 로그 인 만 지원 합 니 다.
자동 로그 인 은 series 변경 을 초래 하지 않 습 니 다.매번 자동 로그 인 할 때마다 series 와 token 두 값 을 동시에 검증 해 야 합 니 다.이 토 큰 이 자동 로그 인 을 사용 하지 않 고 도 둑 맞 았 을 때 시스템 은 불법 사용자 인증 이 통 과 된 후에 token 값 을 새로 고 칩 니 다.이때 합 법 적 인 사용자 의 브 라 우 저 에서 이 token 값 은 이미 효력 을 잃 었 습 니 다.합 법 적 인 사용자 가 자동 로그 인 을 사용 할 때 이 series 에 대응 하 는 token 이 다 르 기 때문에 시스템 은 이 토 큰 이 도 용 된 것 으로 추정 하여 처리 할 수 있 습 니 다.예 를 들 어 이 사용자 의 모든 자동 로그 인 토 큰 을 정리 하고 도 난 당 했 을 수도 있다 는 것 을 알 리 는 등 이다.
Spring Security 는 PersistentRemember MeToken 을 사용 하여 인증 실 체 를 표시 합 니 다.
public class PersistentRememberMeToken {
private final String username;
private final String series;
private final String tokenValue;
private final Date date;
public PersistentRememberMeToken(String username, String series, String tokenValue, Date date) {
this.username = username;
this.series = series;
this.tokenValue = tokenValue;
this.date = date;
}
public String getUsername() {
return this.username;
}
public String getSeries() {
return this.series;
}
public String getTokenValue() {
return this.tokenValue;
}
public Date getDate() {
return this.date;
}
}
영구 화 토 큰 프로젝트 를 사용 하려 면 PersistentTokenRepository 의 인 스 턴 스 를 입력 해 야 합 니 다.PersistentTokenRepository 인 터 페 이 스 는 주로 token 의 추가 삭제 와 관련 되 고 네 개의 인 터 페 이 스 를 수정 합 니 다.
MyPersistentTokenRepository Impl 은 우리 로 하여 금 PersistentTokenRepository 인 터 페 이 스 를 실현 하 게 합 니 다:
@Service
public class MyPersistentTokenRepositoryImpl implements PersistentTokenRepository {
@Autowired
private JPAPersistentTokenRepository repository;
@Override
public void createNewToken(PersistentRememberMeToken persistentRememberMeToken) {
MyPersistentToken myPersistentToken = new MyPersistentToken();
myPersistentToken.setSeries(persistentRememberMeToken.getSeries());
myPersistentToken.setUsername(persistentRememberMeToken.getUsername());
myPersistentToken.setTokenValue(persistentRememberMeToken.getTokenValue());
myPersistentToken.setUser_last(persistentRememberMeToken.getDate());
repository.save(myPersistentToken);
}
@Override
public void updateToken(String series, String tokenValue, Date lastUsed) {
MyPersistentToken myPersistentToken = repository.findBySeries(series);
myPersistentToken.setUser_last(lastUsed);
myPersistentToken.setTokenValue(tokenValue);
repository.save(myPersistentToken);
}
@Override
public PersistentRememberMeToken getTokenForSeries(String series) {
MyPersistentToken myPersistentToken = repository.findBySeries(series);
PersistentRememberMeToken persistentRememberMeToken = new PersistentRememberMeToken(myPersistentToken.getUsername(), myPersistentToken.getSeries(), myPersistentToken.getTokenValue(), myPersistentToken.getUser_last());
return persistentRememberMeToken;
}
@Override
@Transactional
public void removeUserTokens(String username) {
repository.deleteByUsername(username);
}
}
public interface JPAPersistentTokenRepository extends JpaRepository<MyPersistentToken,Long> {
MyPersistentToken findBySeries(String series);
void deleteByUsername(String username);
}
@Entity
@Table(name = "persistent_token")
public class MyPersistentToken {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String username;
@Column(unique = true)
private String series;
private String tokenValue;
private Date user_last;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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 getTokenValue() {
return tokenValue;
}
public void setTokenValue(String tokenValue) {
this.tokenValue = tokenValue;
}
public Date getUser_last() {
return user_last;
}
public void setUser_last(Date user_last) {
this.user_last = user_last;
}
}
자동 로그 인 인증 을 할 때 Spring Security 는 series 를 통 해 사용자 이름,token 및 지난번 자동 로그 인 시간 세 가지 정 보 를 얻 고 사용자 이름 을 통 해 이 토 큰 의 신분 을 확인 하 며 token 대비 로 이 토 큰 이 효과 가 있 는 지 알 수 있 습 니 다.지난번 자동 로그 인 시간 을 통 해 이 토 큰 이 만 료 되 었 는 지 알 수 있 고 전체 검사 가 통 과 된 후에 새로운 token 을 생 성 합 니 다.총결산
Spring Security 학습 의 rememberMe 자동 로그 인 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring Security rememberMe 자동 로그 인 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.