spring/security
#1. security 시작
tokkaiiii
2025. 4. 16. 10:58
1. 의존성 주입
implementation 'org.springframework.boot:spring-boot-starter-security'
이렇게 주입만 해도 자동으로 설정된 보안 기능이 구동된다.
페이지를 제공
SecurityProperties 클래스에서 한 개의 계정을 제공하는데
username: user
password: 랜덤문자열
이다.
SecurityProperties 에서 만들어진 계정은 UserDetailServiceAutoConfiguration 클래스의 inMemoryUserDetailsManager 함수를 탄다 User 객체를 생성해서 관리한다.
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager(SecurityProperties properties, ObjectProvider<PasswordEncoder> passwordEncoder) {
SecurityProperties.User user = properties.getUser();
List<String> roles = user.getRoles();
return new InMemoryUserDetailsManager(new UserDetails[]{User.withUsername(user.getName()).password(this.getOrDeducePassword(user, (PasswordEncoder)passwordEncoder.getIfAvailable())).roles(StringUtils.toStringArray(roles)).build()});
}
SpringBootWebSecuriyConfiguration 클래스에 의해 자동 설정
@ConditionalOnDefaultWebSecurity
static class SecurityFilterChainConfiguration {
SecurityFilterChainConfiguration() {
}
@Bean
@Order(2147483642)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> ((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated());
http.formLogin(Customizer.withDefaults());
http.httpBasic(Customizer.withDefaults());
return (SecurityFilterChain)http.build();
}
}
하지만 아래의 조건이 충족돼야 실행된다
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.boot.autoconfigure.security;
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
class DefaultWebSecurityCondition extends AllNestedConditions {
DefaultWebSecurityCondition() {
super(ConfigurationPhase.REGISTER_BEAN);
}
@ConditionalOnClass({SecurityFilterChain.class, HttpSecurity.class})
static class Classes {
Classes() {
}
}
@ConditionalOnMissingBean({SecurityFilterChain.class})
static class Beans {
Beans() {
}
}
}
클래스패스에 SecurityFilterChain 과 HttpSecurity 가 있어야 하고 SecurityFilterChain bean 이 생성되지 않았어야 한다