728x90
문제
Security를 이용해 게시판 만들기
1. 로그인 한 유저라면 게시글 작성, 자신의 게시글 수정 및 삭제
2. 로그인하지 않은 유저라도 읽기 가능
을 구현함에 있어 모든 글이 인증을 요구하게 되어 2번을 구현하는 데에 어려움을 겪었다
시도
조회 url에 search를 포함시킨 후
AuthFilter에 if문을 추가해 url에 search가 포함되어 있다면 인증을 필요 없이 진행시키도록 했다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String url = httpServletRequest.getRequestURI();
if (StringUtils.hasText(url) &&
(url.startsWith("/api/user") || url.startsWith("/css") || url.startsWith("/js")
||(url.startsWith("/api/post/search"))) {
log.info("인증 처리를 하지 않는 url : " + url);
chain.doFilter(request, response); // 다음 Filter 로 이동
}
하지만 어떤 이유에선지 접근을 할 수 없었다.
해결
문제는 WebSecurityConfig에 있었다.
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
.requestMatchers("/api/user/**").permitAll() // '/api/user/'로 시작하는 요청 모두 접근 허가
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
WebSecurityConfig가 "/api/user"로 시작하는 url이 아니라면 모두 인증을 요구했기 때문이었다.
requestMatchers("/api/user/**) 아래에 아래의 코드를 넣었다.
.requestMatchers("/api/post/search/**").permitAll() // ..
이후 기능이 무사히 동작했다.
알게된 것
Security는 Controller보다 먼저 실행되지만 WebSecurityConfig 클래스 이후에 실행되며
WebSecurityConfig에서 정의한 설정을 기반으로 보안 구성이 이뤄진다.