Config


<aside>

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Autowired
    private final MemberService memberService;

    public SecurityConfig(MemberService memberService) {
        this.memberService = memberService;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .formLogin(form -> form
                        .loginPage("/user/userPage") // 로그인 페이지 경로
                        .usernameParameter("email")
                        .defaultSuccessUrl("/") // 로그인 성공 시 메인 페이지로 이동
                        .failureUrl("/user/loginError")
                        .permitAll() // 로그인 페이지 접근 허용
                )
                .logout(logout -> logout
                        .logoutUrl("/user/logout") // 로그아웃 처리 경로
                        .logoutSuccessUrl("/") // 로그아웃 성공 시 메인 페이지로 이동
                        .invalidateHttpSession(true) // 세션 무효화
                        .deleteCookies("JSESSIONID") // 쿠키 삭제
                        .permitAll() // 로그아웃 URL 접근 허용
                )
                /* 권한 없을시 이동 경로 -> CustomAccessDeniedHandler 사용 */
                .exceptionHandling(exception -> exception
                        .accessDeniedHandler(new CustomAccessDeniedHandler("/user/accessError"))
                )
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/boards/boardDetail/boardUpdate/**", "/boards/form").hasRole("ADMIN") // ADMIN만 접근 가능
                        .anyRequest().permitAll() // 다른 모든 요청은 허용
                );
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return email -> {
            UserDetails userDetails = memberService.loadUserByUsername(email);
            if (userDetails == null) {
                throw new UsernameNotFoundException("사용자를 찾을 수 없습니다: " + email);
            }
            return userDetails;
        };
    }
}

</aside>

Html


<aside>

<div class="py-6">
  <!-- 로그인 상태라면 로그아웃 버튼 -->
  <form th:action="@{/user/logout}" method="post" sec:authorize="isAuthenticated()">
     <button type="submit" class="-mx-3 block rounded-lg px-3 py-2.5 text-base/7 font-semibold text-gray-900 hover:bg-gray-50">
     ogout
     </button>
  </form>

  <!-- 로그아웃 상태라면 로그인 버튼 -->
  <a href="/user/userPage" class="-mx-3 block rounded-lg px-3 py-2.5 text-base/7 font-semibold text-gray-900 hover:bg-gray-50" sec:authorize="isAnonymous()">
    Log in
   </a>
</div>