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