[ODOP] 78일차 - Spring security 권한 설정 및 표현식

[ODOP] 78일차 - Spring security 권한 설정 및 표현식
💡
최신 버전에서는 아래의 방식과는 조금 다르게 권한설정을 진행한다.
아래의 설명들은 모두 구버전(2.6.7)을 기준으로 설명하고 있다

권한 설정 전략

선언적 방식

URL

http.antMatchers("/users/**").hasRole("USER")

Method

@PreAuthorize("hasRole('USER')")
public void user() {
		System.out.println("user");
}

동적 방식 (DB연동)

  • URL
  • Method

선언적 권한 설정 - URL

설정 방법

private void roleConfigure(HttpSecurity http) throws Exception {
    // 주의사항 : 설정 시 구체적인 경로가 먼저 오고 그것 보다 큼 범위의 경로가 뒤에 오도록 해야 한다
    http.antMatcher("/shop/**") // 아래의 해당 보안 속성을 설정할 기준
        .authorizeRequests()
            .antMatchers("/shop/login", "/shop/users/**").permitAll()
            .antMatchers("/shop/mypage").hasRole("USER")
            .antMatchers("/shop/admin/pay").access("hasRole('ADMIN')")
            .antMatchers("/shop/admin/**").access("hasRole('ADMIN') or hasRole('SYS')")
        .anyRequest()
        .authenticated()
    ;
}
메소드 설명
authehticated() 인증된 유저의 접근을 허용
fullyAuthenticated() 인증된 유저의 접근을 허용, remember-me 제외
permitAll() 무조건 접근을 허용
denyAll() 무조건 접근을 차단
anonymous() 익명유저의 접근을 허용
rememberMe() remember-me 를 통해 인증된 사용자의 접근을 허용
access(String) 주어진 SpEL 표현식의 평과 결과가 true 이면 접근을 허용
hasRole(String) 유저가 주어진 권한이 있다면 접근을 허용
hasAuthority(String) 특정 (ROLE_ 접두사가 붙은)권한이 있다면 접근 허용
hasAnyRole(String...) 특정 권한들중 하나라도 일치하면 접근 허용
hasAnyAuthority(String...) 특정 (ROLE_ 접두사가 붙은)권한들중 하나라도 일치하면 접근 허용
hasIpAddress(String) 특정 IP로부터 요청이 왔다면 접근 허용

예제

사용자 생성 및 권한 부여

사용자를 생성하고 권한을 부여할 수 있다

이 기능은 Spring Security 에서 지원하는 configure(AuthenticationManagerBuilder) 를 통해 사용할 수 있다

사용 방법:

@Override
protected void configure(AuthenticationManagerBuilder auth) throw Exception {
		auth.inMemoryAuthentication()
				.withUser("user")
				.password("{noop}1111")
				.roles("USER")
		;
}

위 코드에서 password 를 보면 "{noop}1111" 이라고 적혀있는 모습을 확인할 수 있다.

이는 패스워드 인코딩 이라고 하며 스프링 시큐리티에서 지원하는 패스워드 암호화 컴포넌트를 통해 이루어진다.

만약 이를 지정해주지 않고 비밀번호만 입력 한다면 id 가 지정되지 않았다는 오류가 발생한다.

따라서 암호화를 사용하지 않는 경우 해당 접두사({noop}) 을 꼭 작성해야 한다

  • {noop} : 암호화를 적용하지 않는다