// https://spring.io/guides/gs/securing-web/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
@EnableWebSecurity | Spring Security의 web security support를 가능하게 한다. Spring MVC 통합을 제공 |
SecurityFilterChain | 어떤 URL 경로에 보안을 적용할지 안할지를 정의 위의 코드에서 /, /home는 인증없이 접근 가능 다른 URL 경로는 인증을 받아야 한다. 유저가 성공적으로 로그인을 하면 이전에 요청했던 페이지(인증이 필요했던)로 redirect된다. |
spring.security.basic.enable=false
application.properties에 추가하면, 스프링 시큐리티 기본 인증 비활성화
public class AuthenticationFilter extends org.springframework.web.filter.OncePerRequestFilter
특정한 요청의 인증을 수행하는 Filter
- 요청이 들어온다. setRequestMathcher(RequestMatcher)와 일치하지 않으면 이 필터는 아무것도 하지않는다. FilterChain이 계속된다.
- 만약 일치한다면 HttpServletRequest를 인증으로 변환하려는 시도를 한다. 결과가 빈다면, 필터는 더 이상 아무것도 하지않는다. FilterChain이 계속된다.
- 인증이 생성되면 AuthenticationFilter(AuthenticationManager, AuthenticationConverter)에 지정된 AuthenticationManager가 인증을 수행하기 위해 사용된다.
- AuthenticationFilter(AuthenticationManagerResolver, AuthenticationConverter)에 지정된 AuthenticationManagerResolver는 인증을 하기 위해 context에서 적절한 인증 관리자를 확인하는 데 사용된다.
- 인증이 성공하면, AuthenticationSuccessHandler가 호출되고 SecurityContextHolder에 인증이 설정된다. 그렇지 않으면 AuthenticationFailureHandler가 호출된다.
public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken
username, password를 간단히 표시하도록 설계된 인증 구현
주체 및 자격 증명은 Object.toString() 메서드를 통해 각 속성을 제공하는 개체로 설정해야 한다.
이러한 개체를 사용할 수 있는 가장 간단한 것은 문자열이다.
public interface AuthenticationManager
인증 요청 처리
public interface AuthenticationProvider
클래스가 특정 인증 구현을 처리할 수 있음을 나타낸다.
public interface UserDetailsService
사용자별 데이터를 로드하는 코어 인터페이스
프레임워크 전체에서 사용자 DAO로 사용되며 DaoAuthenticationProvider에서 사용되는 전략
인터페이스는 하나의 읽기 전용 방식만 요구하므로 새로운 데이터 액세스 전략에 대한 지원을 단순화
public interface UserDetails extends java.io.Serializable
코어 사용자 정보를 제공
구현은 보안 목적을 위해 Spring Security에서 직접 사용되지 않는다.
사용자 정보를 저장하기만 하면 나중에 Authentication 객체에 캡슐화된다.
이를 통해 보안과 관련이 없는 사용자 정보(이메일 주소, 연락처와 같은)를 편리한 위치에 저장할 수 있다.
구체적인 구현은 각 방법에 대해 상세히 기술된 무효 계약이 시행되도록 각별히 주의해야 한다.
구현은 null이 아닌 반대되는 구체적인 각각의 메소드를 보장하기 위해 특수한 케어를 한다.
java.util.Collections<? extends GrantedAuthority> | getAuthorities() | 사용자에게 부여된 권한을 반환 |
java.lang.String | getPassword() | 사용자를 인증하기 위해 사용한 비밀번호를 반환 |
java.lang.String | getUsername() | 사용자를 인증하기 위해 사용한 아이디를 반환 |
boolean | isAccountNonExpired() | 사용자의 계정이 만료되었는지 여부를 나타냄 true = 사용자 계정이 아직 만료되지 않았을 때 |
boolean | isAccountNonLocked() | 사용자의 계정이 잠겼는지 여부를 나타냄 true = 사용자 계정이 잠기지 않았을 때 |
boolean | isCredentialsNonExpired() | 사용자의 자격 증명(비밀번호)이 만료되었는지 여부를 나타냄 true = 만료되지 않았을 때 |
boolean | isEnabled() | 사용자가 활성화/비활성화되었는지 나타냄 true = 사용자가 활성화되었을 때 |
참고 👇
반응형
'Framework > Spring Boot' 카테고리의 다른 글
[Error] Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource (0) | 2022.12.08 |
---|---|
트랜잭션 (0) | 2022.10.26 |
OAuth2User (0) | 2022.10.06 |
[Error] ModelMapper 매핑이 안될 때 (0) | 2022.10.05 |
ModelMapper Matching Strategy 정리 (0) | 2022.10.05 |