보안 (Spring Security)
인증 과 인가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
위의 starter를 추가하고 웹 애플리케이션을 실행하면 다음과 같은 로그가 출력
메모리에 회원이 하나 자동생성 id : user Using generated security password: 728a3a47-be75-449f-96eb-08276e5a182e
인증을 처리하는 Spring Security필터는 내부적으로 UserDetailsService 를 구현하는
Bean을 사용하여 아이디, 암호가 일치하는지 검사한다.
UserDetailsService를 구현하는 기본 객체가 내부적으로 user정보를 가진다.
UserDetailsService가 가지고 있는 메소드
UserDetails loadUserByUsername(java.lang.String username)
throws UsernameNotFoundException
// spring security 설정 파일은 보통
// WebSecurityConfigurerAdapter 를 상속받아서 만든다.
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 아예 인가처리를 하지 않는 (무시하는 URL설정) - 이미지 or css, javascript
@Override
public void configure(WebSecurity web) throws Exception {
// PathRequest.toStaticResources().atCommonLocations()
// CSS(new String[]{"/css/**"}),
// JAVA_SCRIPT(new String[]{"/js/**"}),
// IMAGES(new String[]{"/images/**"}),
// WEB_JARS(new String[]{"/webjars/**"}),
// FAVICON(new String[]{"/**/favicon.ico"});
web.ignoring()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.requestMatchers(new AntPathRequestMatcher("/**.html"))
.requestMatchers(new AntPathRequestMatcher("/static/**"));
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.logout() // logout설정
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/main")
.permitAll().and()
.authorizeRequests() // 인가에 대한 설정
.antMatchers("/users/join").permitAll() // 모든 권한
.antMatchers("/users/welcome").permitAll()
.antMatchers("/users/login").permitAll()
.antMatchers("/users/**").hasAnyRole("USER", "ADMIN") // user, admin을 가지고 있어야
.antMatchers("/main").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().fullyAuthenticated()
.and()
.formLogin() // 사용자가 정의하는 로그인 화면을 만들겠다.
.loginProcessingUrl("/users/login") // 로그인 화면
.loginPage("/users/login") // 사용자가 입력한 id, password가 전달되는 url경로(필터가처리)
.usernameParameter("email")
.passwordParameter("password")
.failureUrl("/users/login?fail=true");
}
}
@GetMapping("/login")
public String login(
@RequestParam(name = "fail",
required = false,
defaultValue = "false") String errorFlag){
return "users/login"; // view name 을 리턴한다.
}