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>