1. 로그 레벨 설정
스프링 시큐리티 기본 설정에서 서버를 켜면 콘솔에 비밀번호가 출력된다.
- ID: user
- Using generated security password: 914ea598-3db6-42cf-9f37-e13366f991ae
localhost:8080 -> localhost:8080/login
로그인 화면에서 출력된 비밀번호를 입력해야 애플리케이션에 접근할 수 있다.
2. org.springframework.security.core.userdetails.User 를 상속받은 User 클래스 생성
Class SecurityUser extends User
이 클래스는 회원(Member)에 해당하는 도메인과 매칭된다.
생성자에서 부모 생성자를 호출하며 파라미터로 id, password, 권한 정보를 전달한다.
그리고 member 객체를 필드로 가지고 있어서 일종의 wrapping class가 된다.
3. org.springframework.security.core.userdetails.UserDetailsService 상속받은 Service 클래스 생성
Member 대신 UserDetail 을 반환한다.
org.springframework.security.core.userdetails 가 정의하는 Exception 들을 활용한다.
4. Spring Security Web MVC 설정 - SecurityConfig 클래스 생성
기존에 SecurityConfig 를 정의하기 위해 상속한 WebSecurityConfigurerAdapter 가 Deprecated 됨
SecurityFilterChain Bean 등록
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.csrf().disable()
.authorizeRequests()
.antMatchers("/", "/members/login").permitAll()
.antMatchers("/manager/**").hasAnyRole("USER", "MANAGER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login").defaultSuccessUrl("/main", true)
.loginProcessingUrl("/loginAction").defaultSuccessUrl("/main", true)
.and()
.exceptionHandling().accessDeniedPage("/accessDenied")
.and()
.logout().logoutUrl("/logout").logoutSuccessUrl("/")
.and()
.userDetailsService(userDetailService)
.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
filterChain(HttpSecurity http)
- @EnableWebSecurity: 스프링 Security 설정 = Security 필터 등록
- @Bean ...(HttpSecurity http) {} : HttpSecurityConfiguration이 HttpSecurity Bean을 주입해준다.
- .antMatchers("/", "/members/login").permitAll() : 모든 사용자 접근 가능
- .antMatchers("/manager/**").hasRole("USER", "MANAGER") : USER, MANAGER 권한을 가진 사용자 접근 가능
- .anyRequest().authenticated() : 그 외 url 에 대한 요청은 모두 인증된 사용자만 접근 가능
- .loginPage("/login").defaultSuccessUrl("/main", true) : 로그인 페이지, 로그인 성공 url 매칭. 미인증 상태에서 인증이 필요한 페이지 접근 시 로그인 페이지로 이동한다.
- .loginProcessingUrl("/loginAction").defaultSuccessUrl("/main", true) : 로그인 액션 프로세스(POST), 액션 성공 url 매칭
- .exceptionHandling().accessDeniedPage("/accessDenied") : 권한 없는 상용자 접근 시 url 매칭
- .logout().logoutUrl("/logout").logoutSuccessUrl("/") : 로그아웃 url과 로그아웃 성공 url 매칭

passwordEncoder() : 비밀번호 암호화(단방향)를 위한 등록. Member 객체를 생성할 때 이것을 의존관계 주입받아 직접 password를 encode 해야 한다.
5. 컨트롤러에서 Authentication(인증 정보) 주입 받기
@RequestMapping
public String main(Authentication authentication) {
SecurityUser securityUser = authentication.getPrincipal(); //SecurityUser extends User
...
}
'etc.' 카테고리의 다른 글
| [RestAPI] RESTful 웹 API 디자인 (0) | 2023.01.31 |
|---|---|
| [Intellij] 서블릿 프로젝트 생성 (0) | 2023.01.30 |