본문 바로가기

SpringSecurity

SringSecurity(기본API & Filter이해)

반응형

 

선언적 방식

      URL
          http.antMatchers("/users/**").hasRole(“USER")
      Method
          @PreAuthorize(“hasRole(‘USER’)”)
            public void user(){ System.out.println(“user”)}



동적 방식 – DB 연동 프로그래밍
      URL
      Method

 

URL 방식에 대해서 한번 살펴 보기로 한다

 

 

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .antMatcher(“/shop/**”) // 사용자의 요청이 설정한 경로로 접근할때만 설정클래스의 보안기능이 호출
        만약 다른경로로 호출하게 된다면 보안기능이 호출되지 않는다. 특정한 자원 경로로 제한하고자 할때 자원경로를
        적어주면 된다. 만약 이부분을 생략하게 되면 특정경로가 아닌 모든요청에 대해서 보안검사를 하게된다.
        
        .authorizeRequests() 
                
        .antMatchers(“/shop/login”, “/shop/users/**”).permitAll()
        // 현재 해당하는 하위경로로 요청에 대한 정보와 우리가 설정한
        정보가 일치가 되면 그요청에 대해서는 허용하겠다 // 인가 설정
        
        .antMatchers(“/shop/mypage”).hasRole(“USER”)
        //이요청과 매칭 되는 요청은 인가 심사를하는데 최소한 접근하고자 하는 유저는 "USER"라는 권한을
        가지고 있어야 접근이 가능하다 그러니까 설정해둔 경로와 일치한다면 인가심사를 하겠다 는말이다.                   
        
        .antMatchers("/shop/admin/pay").access("hasRole('ADMIN')");
    		// *
            
        .antMatchers("/shop/admin/**").access("hasRole('ADMIN') or hasRole(‘SYS ')");
         // *
         
        .anyRequest().authenticated()
        
        //여기에 해당하는 모든 인가심사를 다 통과해야 실제로 서버자원에 접근이 가능하다
        하나라도 권한이 없거나 포함되지 않으면 심사 통과가 되지 않는다.
        
        
       }
       
       ⛳️설정 시 구체적인 경로가 먼저 오고 그것 보다 큰 범위의 경로가 뒤에 오도록 해야 한다

 

 

 

 

.antMatchers("/shop/admin/pay").access("hasRole('ADMIN')");

.antMatchers("/shop/admin/**").access("hasRole('ADMIN') or hasRole(‘SYS ')");

 

 

 


이코드를 보면 pay라는 경로에 접근 할수 있는 권한은 ADMIN이라는 권한을 가진 사용자만 접근이 가능하다 

근데 밑에 코드를 보면 SYS라는 권한을 가진 사용자가 있는데 이코드의 순서가 바뀐다면 SYS라는 권한을 가진사용자도 pay라는 서버자원에 접근이가능하게 된다.  위에서 아래로 가면서 인가처리를 하게 되기 때문이다.  그러니 주의 하면서 설계하도록 하자

 

 

메소드

 동작

 authenticated()

 인증된 사용자의 접근을 허용

 fullyAuthenticated()

 인증된 사용자의 접근을 허용, rememberMe 인증 제외,
form인증방식으로만 인증된 사용자에게만 표현식을 설정하면된다

 permitAll()

 무조건 접근을 허용

 denyAll()

 무조건 접근을 허용하지 않음

 anonymous()

 익명사용자의 접근을 허용

 rememberMe()

 기억하기를 통해 인증된 사용자의 접근을 허용

 access(String)

 주어진 SpEL 표현식의 평가 결과가 true이면 접근을 허용

 hasRole(String)

 사용자가 주어진 역할이 있다면 접근을 허용 

 hasAuthority(String) 

 사용자가 주어진 권한이 있다면

 hasAnyRole(String...)

 사용자가 주어진 권한이 있다면 접근을 허용

 hasAnyAuthority(String...)

 사용자가 주어진 권한 중 어떤 것이라도 있다면 접근을 허용

 hasIpAddress(String)

 주어진 IP로부터 요청이 왔다면 접근을 허용



          anonymous() 

  • 기본적으로 Rollanonymous 이권한이 부여가 되는데 이권한을 부여 받은 사용자는 어나니머스 표현식에 설정된 자원접근이 가능하다 일반적으로 유저가 인증을 받게 되면 RollUser의 권한이 부여되는데 이 유저는 Rollanonymous 자원에 접근이 불가능하다 익명사용자나 익명사용자가 아닌 유저가 모두 접근이 가능하게 하려면 permitAll()를 사용하면된다.

 

 

configure @override

 

필자는 user, sys, admin 3개를 생성해서 각각 권한을 부여 하였다.

 

 

그리고 각부여한 권한에 따라서 접근가능한 URI도 설정해줬다.

 

 

 

user 계정으로 접속

 

 

user계정으로 dmin접근

 

 

 

admin계정으로 접근

 

 

 

 

anyRequest().authenticated();

특정한 자원정보와 권한 정보를 설정해줬다 이정보를 제외하고는 모든 요청에 대해서 인증을 받은 사용자만 서버자원에 접근이 가능하다 고 설정되어 있다. 인증을 받지 못하면 어떤 서버자원에도 접근이 불가능하다.

 

어드민이 USER와 SYS의 서버자원에 접근하기 위해서는 roles에 접근하고자 하는 권한을 할당해주면 된다

그렇게 되면 admin의 권한을 가진사용자가  user와 sys 자원에 접근이 가능하다.  ROLE Hierarchy 사용하게되면  별도로 이렇게 명시적으로 해당권한을 설정하지 않아도 해당하는 서버자원에 접근이 가능하다.

 

 

필자는 위치를 바꿔서 와스를 구동 해봤다.

전 위치에서는SYS의 권한을 가진사용자는 admin/pay 서버자원을 접근할수가 없었다 하지만 위치를 바꿈으로써 SYS의 권한을 가진 사용자도 admin/pay에 접근이 가능하다 admin/* 패턴에 포함되기 때문에 3번째로 가기전에 두번째에서 실행이 되버린다.

 

 

반응형