Spring
Security - (3)
으엉어엉
2024. 12. 14. 18:19
728x90
인가(authorization)
특정한 경로에 요청이 오면 Controller 클래스에 도달하기 전 필터에서 Spring Security가 검증을 함
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // SpringSecurity 관리하게끔 함
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/", "/login").permitAll()
.requestMatchers("/admin").hasRole("ADMIN")
.requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
);
return http.build(); //Builder 패턴으로
}
}
람다식으로 작성해야함.
requestMatcher는 원하는 경로에 특정한 작업을 진행할 수 있게하는 메소드이다. 또한 특정한 권한을 줄 수 있다.
permitAll()
을 하게 되면 로그인이 필요가 없어진다. 가장 상단부터 아래로 실행순서이다. 따라서 순서를 잘 지켜야한다.
하지만 로그인을 하지 않았다면 admin에는 접속이 제한된다. -> 이건 로그인 폼으로 해결해야한다.
@Bean //password 단방향 Hash 암호화.
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
현재 사용자 id
SecurityContextHolder.getContext().getAuthentication().getName();
현재 사용자 Role
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
Iterator<? extends GrantedAuthority> iter = authorities.iterator();
GrantedAuthority auth = iter.next();
String role = auth.getAuthority();
//초 기반
server.servlet.session.timeout=1800
//분 기반
server.servlet.session.timeout=90m
동일한 아이디로 다중 로그인
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.sessionManagement((auth) -> auth
.maximumSessions(1) //동시 중복로그인
.maxSessionsPreventsLogin(true)); //기존것을 로그아웃 시킬지
return http.build();
}
- sessionManagement().sessionFixation().none() : 로그인 시 세션 정보 변경 안함
- sessionManagement().sessionFixation().newSession() : 로그인 시 세션 새로 생성
- sessionManagement().sessionFixation().changeSessionId() : 로그인 시 동일한 세션에 대한 id 변경
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http
.sessionManagement((auth) -> auth
.sessionFixation().changeSessionId());
return http.build();
}
728x90