3일전꺼.. 기억해서 다시 써보기
스프링 시큐리티 (3/6)에서 이어지는내용
상세 @EnableWebSecurity
URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션이다.
@EnableWebSecurity 어노테이션을 사용하면 내부적으로 SpringSecurityFilterChain이 동작하여 URL 필터가 적용된다. 스프링 시큐리티의 세부 설정은 SecurityFilterChain 빈을 생성하여 설정할 수 있다.
상세 @EnableGlobalMethodSecurity
별로 다를바없다..
@EnableGlobalMethodSecurity(securedEnabled = true, order = 2)
//securedEnabled = true @Secured 어노테이션 활성화를 하는데
order =2 만약 @EnableGlobalMethodSecurity어노테이션이 여러개 있을때 우선순위는 2번으로 하겠다.
시큐리티를 적용해주기위해서 WebSecurityConfig클래스를 만들어서 Jwt필터로 Jwt토큰과, UsernamePasswordAuthenticationToken를 실행시켜서 회원가입자가 있을때 Authentication에 유저정보를 저장하면서 권한도 저장해두는데 이것을 파라미터에서 @AuthenticationPrincipal라는 어노테이션을 이용한다면 실행되면서 AuthenticationPrincipalArgumentResolver가 @AuthenticationPrincipal어노테이션이 붙은 파라미터를 찾아서 Atuhentication내에서 알아낸 클래스이름과 컨테이너에서 설정한 값을 가지고 인증시 사용했던 인스턴스를 만들어내고 해당 Principal(jwt토큰이나 UsernamePasswordAuthenticationToken를 실행해서 Atuhentication에 저장해둔 값)을 돌려준다.
UserDetails 구현체 메소드
Collection<? extends GrantedAuthority> getAuthorities()
에서 권한 부여하고
설정에서 이 페이지는 이정도의 권한을 가진자만 가능하다.
설정시 포함하는 곳은 다써줘야한다.. 너무 많으면 그만큼 오래걸릴수도있다.
//.antMatchers("/user/VVIP").hasRole("ROLE_VVIP","ROLE_ADMIN")
//.antMatchers("/user/VIP").access("hasRole('ROLE_VIP', 'ROLE_VVIP','ROLE_ADMIN')")
.antMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN")
상세내용 Meta-Annotaiton(@Target, @Retention,@Component)
meta-annotation 은 다른 annation 에서도 사용되는 annotation 의 경우를 말하며 custom-annotation 을 생성할 때 주로 사용됩니다.
다른 설명으로는 애노테이션의 정의에 부여된 애노테이션이라는 의미이다.
Meta-Annotaiton(@Target, @Retention,@Component)
@Retetion 은 Annotation 이 실제로 적용되고 유지되는 범위를 의미합니다. 유지되는 범위를 의미하는데 자기자신에게도 쓰인다, @Target도 마찬가지입니다.
@Retention(RetentionPolicy.RUNTIME)
SOURCE : 어노테이션을 사실상 주석처럼 사용하는 것. 컴파일러가 컴파일할때 해당 어노테이션의 메모리를 버립니다.
CLASS : 컴파일러가 컴파일에서는 어노테이션의 메모리를 가져가지만 실질적으로 런타임시에는 사라지게 됩니다. 런타임시에 사라진다는 것은 리플렉션으로 선언된 어노테이션 데이터를 가져올 수 없게 됩니다. 디폴트값입니다.
RUNTIME : 어노테이션을 런타임시에까지 사용할 수 있습니다. JVM이 자바 바이트코드가 담긴 class 파일에서 런타임환경을 구성하고 런타임을 종료할 때까지 메모리는 살아있습니다.
@Target(ElementType.TYPE)
예를 들어 위에서 사용한 ElementType.TYPE 은 해당 Annotation 은 타입 선언 시 사용한다는 의미입니다.
@Component 란
개발자가 직접 작성한 Class 를 Bean 으로 만드는 것이다.
한 개 이상의 @Bean을 제공하는 클래스에 명시하는 어노테이션으로, IOC Container에게 해당 클래스가 Bean으로 구성된 클래스라는 것을 알려줍니다.
@Import를 사용하면 설정 파일간의 계층을 만들 수 있습니다.
@Import( {AppConf1.class, AppConf2.class} ) // AppConf1, AppConf2 두 가지 설정 클래스를 포함시킨다.
public class AppConfImport {
위에 만든 2개의 클래스를 상속계층처럼 두 개 이상의 설정 파일을 서로 연결시키는 방법은 @Import 애노테이션을 사용하는 것입니다.
Non-@Configuration 클래스를 사용하는 경우 @ImportResource 를 사용하자.