티스토리 뷰

스프링 시큐리티에서는 여러 가지의 사용자 스토어 구성 방법을 제공한다.

 

스프링 시큐리티 사용자 스토어

 

  • 인메모리(in-memory) 사용자 스토어
  • JDBC 기반 사용자 스토어
  • LDAP 기반 사용사 스토어
  • 커스텀 사용자 명세 서비스

하지만 스프링 시큐리티 기본 설정들을 그대로 이용하기에는 부족한 것들이 많기 때문에 커스터마이징을 하는게 더 좋다.


사용자 인증의 커스터마이징

 

  1. 스프링 설정 클래스를 만들고 @EnableWebSecurity 어노테이션을 추가하고 WebSecurityConfigurerAdapter 클래스를 상속
  2. PasswordEncoder를 Bean 객체에 추가하고 AuthenticationManagerBuilder 객체를 매개변수로 하는 configure 메소드를 오버 라이드 한다.
  3. 사용자 정의 서비스 클래스를 UserDetailsService 인터페이스 구현체로 만든다.
  4. Entity 클래스를 UserDetails 인터페이스 구현체로 만든다.

스프링 설정 클래스를 만들고 @EnableWebSecurity 어노테이션을 추가하고 WebSecurityConfigurerAdapter 클래스를 상속
PasswordEncoder를 Bean 객체에 추가하고 AuthenticationManagerBuilder 객체를 매개변수로 하는 configure 메소드를 오버 라이드 한다.
사용자 정의 서비스 클래스를 UserDetailsService 인터페이스 구현체로 만든다.
Entity 클래스를 UserDetails 인터페이스 구현체로 만든다.


웹 요청 보안 처리하기

HttpSecurity 객체를 매개변수로 갖는 configure 메소드를 오버라이드 한다.

요청 경로가 보안 처리되는 방법을 정의하는 구성 메소드

메소드 하는 일
access(String) 인자로 전달된 SpEL 표현식이 true면 접근을 허용한다.
anonymous() 익명의 사용자에게 접근을 허용한다.
authenticated() 익명이 아닌 사용자로 인증된 경우 접근을 허용한다.
denyAll() 무조건 접근을 거부한다.
fullyAuthenticated() 익명이 아니거나 또는 remember-me가 아닌 사용자로 인증되면 접근을 허용한다.
hasAnyAuthority(String...) 지정된 권한 중 어떤 것이라도 사용자가 갖고 있으면 접근을 허용한다.
hasAnyRole(String...) 지정된 역할 중 어느 하나라도 사용자가 갖고 있으면 접근을 허용한다.
hasAuthority(String) 지정된 권한을 사용자가 갖고 있으면 접근을 허용한다.
hasIpAddress(String) 지정된 IP 주소로부터 요청이 오면 접근을 하용한다.
hasRole(String) 지정된 역할을 사용자가 갖고 있으면 접근을 허용한다.
not() 다른 접근 메소드들의 효력을 무효화한다.
permitAll() 무조건 접근을 허용한다.
rememberMe() remember-me(이전 로그인 정보를 쿠키나 데이터베이스로 저장한 후 일정 기간 내에 다시 접근 시 저장된 정보로 자동 로그인됨)를 통해 인증된 사용자의 접근을 허용한다.

 

access() 메소드에 들어가는 SpEL

보안 표현식 산출 결과
authentication 해당 사용자의 인증 객체
denyAll 항상 false를 산출한다.
hasAnyRole(역할 내역) 지정된 역할 중 어느 하나라도 해당 사용자가 갖고 있으면 true
hasRole(역할) 지정된 역할을 해당 사용자가 갖고 있으면 true
hasIpAddress(IP 주소) 지정된 IP 주소로부터 해당 요청이 온 것이면 true
isAnonymous() 해당 사용자가 익명 사용자이면 true
isAuthenticated() 해당 사용자가 익명이 아닌 사용자로 인증되었으면 true
isFullyAuthenticated() 해당 사용자가 익명이 아니거나 또는 remember-me가 아닌 사용자로 인증 되었으면 true
isRememberMe() 해당 사용자가 remember-me 기능으로 인증되었으면 true
permitAll 항상 true를 산출한다.
principal 해당 사용자의 principal 객체

 

커스텀 로그인 페이지 경로 지정하기

.and()
.formLogin() // 커스텀 로그인 폼을 구성하기 위해 호출
.loginPage("/login") // 커스텀 로그인 페이지 경로
.defaultSuccessUrl("/design") // 로그인 후에 /design 페이지로 이동
// 사용자가 로그인 전에 어떤 페이지에 있었는 지와 무관하게 로그인 후에는 무조건 /design 페이지로 이동
// .defaultSuccessUrl("/design", true)

 

로그아웃하기

.and()
.logout()
.logoutSuccessUrl("/") // 로그아웃 이후에 홈페이지로 이동
<!-- 로그아웃 기능을 제공하기 위해 해당 뷰에 로그아웃 폼과 버튼을 추가해야 한다 -->
<form method="POST" th:action="@{/logout}">
	<input type="submit" value="Logout"/>
</form>
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함