스프링 시큐리티 도입하자마자 모든 페이지에대해서 인증을 필요로함
SecurityFilterChain을 만들면 디폴트 설정꺼진다.
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.build();
}
}
메서드 안에서 아무것도 안하니 디폴트 설정을 끄는 효과
하지만 csrf체크는 한다.
csrf끄는방법 세가지
http.csrf(csrf-> csrf.disable());
<form class="flex flex-col gap-4" method="POST" onsubmit="submitLoginForm(this); return false;">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
post보내는 폼안에 csrf토큰을 넣어서 함께보낸다.
하지만 이것도 생략가능하다
폼안에 th:action 이것만 붙여주면 됨(룰이니 외울걸)
form 에서 method 가 POST 이고 th:action 속성이 있다면 csrf 토큰은 자동동봉된다.
<form class="flex flex-col gap-4" method="POST" th:action="|/member/login|" onsubmit="submitLoginForm(this); return false;">
//폼 전송시에 본인이 본인에게 보낼때, th:action="" 는 안되고 th:action 은 된다.
<form th:action class="flex flex-col gap-4" method="POST" onsubmit="submitModifyForm(this); return false;">
룰이다
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
return http
.formLogin(
formLogin -> formLogin
.loginPage("/member/login") //폼의 위치
.loginProcessingUrl("/member/login") //폼 전송 위치
.usernameParameter("username")
.passwordParameter("password")
.defaultSuccessUrl("/article/list")
)
.build();
}
}
.loginPage("/member/login")
.loginProcessingUrl("/member/login") //이거 두개 위치 같으면 생략가능
.usernameParameter("username")
.passwordParameter("password")
기본이 username, password라서 이것도 생략가능
@Service
@RequiredArgsConstructor
public class CustomUserDetailService implements UserDetailsService {
private final MemberService memberService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Member member = memberService.findByUsername(username).get();
return new User(member.getUsername(),member.getPassword(), member.getAuthorities());
}
}
스프링 시큐리티가 세션에 데이터를 저장하는 방법을 따른다.
스프링 시큐리티한테 member 클래스가 로그인관련 클래스인것을 가르쳐주는것.,
// 20231128175601
// http://localhost:8021/home/session
{
"SPRING_SECURITY_CONTEXT": {
"authentication": {
"authorities": [
{
"authority": "ROLE_MEMBER"
}
],
"details": {
"remoteAddress": "0:0:0:0:0:0:0:1",
"sessionId": "339B74BA8B0F6DBB74251CB7DFE30C75"
},
"authenticated": true,
"principal": {
"password": null,
"username": "user1",
"authorities": [
{
"authority": "ROLE_MEMBER"
}
],
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true
},
"credentials": null,
"name": "user1"
}
}
}
@PreAuthorize를 통해서 기존 구현했던 인터셉터들을 대체한다.
스프링 시큐리티에서 제공하는 각 액션마다 isAnonymous등을 이용한다. 로그인 안한사람만 들어오는 등 스토리보드를 짤수있다.
isAuthentication등~~
시큐리티컨피그 클래스에 @EnableMethodSecurity를 추가해준다. 이건 룰
관리자의 경우 @PreAuthorize("hasRole('ADMIN')") 오소리티를 가지고있는 브라우저만 접근가능
hasRole("ADMIN") = hasAuthority("ROLE_ADMIN")