1) 속성
| 설명 | 예제 | |
|---|---|---|
sec:authentication="표현식" |
현재 인증된 사용자 정보 표시 | <span sec:authentication="name"></span> |
sec:authorize="표현식" |
특정 조건(권한)을 만족하는 경우만 해당 HTML 요소 렌더링 |
<div sec:authorize="isAuthenticated()">
|
| 표현식 | 설명 |
|---|---|
hasRole('권한명') |
해당 권한을 가진 유저만 접근 가능 |
hasAnyRole('권한1', '권한2') |
작성된 권한 중 하나를 가진 유저만 접근 가능 |
permitAll() |
모든 유저 접근 가능 |
denyAll() |
모든 유저의 접근 제한 |
isAnonymous() |
인증하지 않은 유저만 접근 가능 |
isRememberMe() |
자동 로그인 기능을 사용한 유저만 접근 가능 |
isAuthenticated() |
인증한 유저만 접근 가능 |
isFullyAuthenticated() |
인증을 하고, 자동 로그인 기능을 사용하지 않은 유저만 접근 가능 |
3)추가설명
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
1) MemberController - remember-me 쿠키 무효화
// 쿠키(remember-me) 무효화
Cookie rememberMe = new Cookie("remember-me", null);
rememberMe.setMaxAge(0); // 쿠키 수명 0초 만들기
rememberMe.setPath("/"); // 모든 경로의 쿠키 삭제
response.addCookie(rememberMe); // 브라우저의 쿠키 정보 무효화
2) MemberService - remember-me DB 삭제
public int updateMember(MemberDto param) {
int result = 0;
try {
// (1) 데이터베이스 회원 정보 수정
param.setMember_pw(passwordEncoder.encode(param.getMember_pw()));
Member updated = repository.save(param.toEntity());
if(updated != null) {
// (2) remember-me(DB, cookie 두 곳에 있다.)가 있다면 무효화
// DB는 서비스에서! cookie는 컨트롤러에서! 하자
// Springboot가 JdbcTemplate 방식을 쓰기 때문에 방식을 존중하는 것
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "DELETE FROM persistent_logins WHERE username = ?";
jdbcTemplate.update(sql, param.getMember_id());
// (3) 변경된 회원 정보 Security Context에 즉시 반영
UserDetails updatedUserDetails = userDetailsService.loadUserByUsername(param.getMember_id());
Authentication newAuth = new UsernamePasswordAuthenticationToken(
updatedUserDetails, updatedUserDetails.getPassword(), updatedUserDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(newAuth);
result = 1;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
해당 코드 변경된 회원정보를 null로 Security Context에 반영
SecurityContextHolder.getContext().setAuthentication(null);