TroubleShooting

[Springboot] 인증 및 인가를 이용한 게시판 CRUD

KJihun 2023. 7. 3. 20:49
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에서 정의한 설정을 기반으로 보안 구성이 이뤄진다.