Spring Security에서의 권한 별 접근은 아래 source 처럼 대부분 configure(HttpSecurity http)에 설정을 하여 관리를 하게 됩니다.


   @Override

   protected void configure(HttpSecurity http) throws Exception {

      http.httpBasic().and().authorizeRequests()

        .antMatchers("/").permitAll()

        .antMatchers("/page2").hasRole("ADMIN")

        .antMatchers("/page1").hasRole("USER")

        .anyRequest().authenticated()

        .and().logout().permitAll()

        .and().formLogin()

        .and().csrf().disable();

  }


다른 방법을 찾아보면 Controllerannotation을 추가하여 관리하는 방법도 있는데 이것이 @PreAuthorize, @PostAuthorize, @Secured 입니다사용 방법도 너무나 간단한데 권한 설정이 필요한 위치에 @PreAuthorize("hasRole('ROLE_ADMIN')") 이런식으로 어노테이션을 추가해 주면 권한 별로 접근을 통제 하게 됩니다예를 들자면...


    @PreAuthorize("hasRole('ROLE_ADMIN')")

    @RequestMapping("/preRole1")

    public @ResponseBody String preRole1() throws Exception {

              

           return "@PreAuthorize : get role ROLE_ADMIN";

    }


위에있는 예제처럼 추가를 하였는데 아무런 작동을 하지 않는다면 @PreAuthorize @Secured의 사용은 처음에는 비활성화 되어 있어서 사용 하려면 설정을 해줘야 됩니다이것도 아주 간단 한데 Configure 클래스 파일 상단에 아래 코드를 추가해 주기만 하면 활성화 됩니다.

@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)



테스트


몇가지 예를 들어 간단하게 테스트를 해보겠습니다.

 

copycodingADMIN 권한이고 honggil이는 USER 권한을 가지도록 configure에 설정을 합니다.


 @Autowired

 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

    auth.inMemoryAuthentication()

        .withUser("copycoding").password(passwordEncoder().encode("copycopy")).roles("ADMIN");

    auth.inMemoryAuthentication()

        .withUser("honggil").password(passwordEncoder().encode("hoho")).roles("USER");

 }


Method에는 annotation을 사용하여 각 권한 별로  접근 설정을 합니다.


 @PreAuthorize("hasRole('ROLE_ADMIN')")

 @RequestMapping("/preRole1")

 public @ResponseBody String preRole1() throws Exception {

              

              return "@PreAuthorize : get role ROLE_ADMIN";

 }

       

 @PreAuthorize("hasRole('ROLE_USER')")

 @RequestMapping("/preRole2")

 public @ResponseBody String preRole2() throws Exception {

              

               return "@PreAuthorize : get role ROLE_USER";

 }

       

 @Secured("ROLE_ADMIN")

 @RequestMapping("/secRole1")

 public @ResponseBody String secRole1() throws Exception {

              

               return "@Secured : get role ROLE_ADMIN";

 }

 

 @Secured("ROLE_USER")

 @RequestMapping("/secRole2")

 public @ResponseBody String secRole2() throws Exception {

              

               return "@Secured : get role ROLE_USER";

 }



@PreAuthorize 테스트


ADMIN 권한이 있는 copycoding으로 로그인을 진행 합니다.


Spring Security PreAuthorize Secured


로그인이 성공 하면 http://localhost:9090/preRole1 에 접속해 봅니다


Spring Security PreAuthorize Secured


접근 권한이 있으니 접근을 할 수 있습니다.


그러면 이번엔 http://localhost:9090/preRole2 에 접속 합니다.


Spring Security PreAuthorize Secured


ADMIN만 접근 가능하니 USER 권한으로는 접근이 불가능 합니다


 

@Secured 테스트

 

USER 권한이 있는 honggil로 로그인을 하고 http://localhost:9090/secRole1 를 호출 합니다.


Spring Security PreAuthorize Secured


ADMIN만 접근 권한이 있으므로 접속이 차단 됩니다.

 

이번엔 http://localhost:9090/secRole2에 접속하면


Spring Security PreAuthorize Secured


USER 권한을 가지고 있어 접속이 가능 합니다.


configure를 이용하는 방법과 annotation을 이용하는 방법의 차이는 접근 권한을 한곳에서 관리 하느냐 여러곳에서 필요에 따라 관리하느냐 하는 관리적인 관점의 차이인데 프로젝트에 따라서 선택을 하던가 적절히 섞어서 사용 하던가 하면 될것 같습니다.

 

@PreAuthorize 와 쌍으로 @PostAuthorize 도 있습니다차이점은 @PreAuthorize 는 말 그대로 실행 전에 권한을 검사하는 거고 @PostAuthorize 는 실행 후 권한을 검사하는 건데 이것도 필요에 따라 선택을 하면 되겠죠.


전체 소스

WebSecurityConfigurerAdapter

package com.copycoding.security;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import org.springframework.security.crypto.password.PasswordEncoder;

 

@Configuration

@EnableWebSecurity

@EnableGlobalMethodSecurity(securedEnabled=true, prePostEnabled=true)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 

        @Override

        protected void configure(HttpSecurity http) throws Exception {

               http.httpBasic().and().authorizeRequests()

        .antMatchers("/").permitAll()

        .antMatchers("/page2").hasRole("ADMIN")

        .antMatchers("/page1").hasRole("USER")

        .anyRequest().authenticated()

        .and().logout().permitAll()

        .and().formLogin()

        .and().csrf().disable();

        }

       

        @Autowired

        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

               auth.inMemoryAuthentication()

                       .withUser("copycoding").password(passwordEncoder().encode("copycopy")).roles("ADMIN");

               auth.inMemoryAuthentication()

                       .withUser("honggil").password(passwordEncoder().encode("hoho")).roles("USER");

        }

       

        @Bean

    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();

    }

} 


Controller

 package com.copycoding.security;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

 

import org.springframework.security.access.annotation.Secured;

import org.springframework.security.access.prepost.PreAuthorize;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;

 

@RestController

public class TestController {

       

        @RequestMapping("/")

    public @ResponseBody String home() throws Exception {

 

               return "Spring Boot ";

        }

       

        @RequestMapping("/page1")

    public @ResponseBody String pageNo1(HttpSession session, HttpServletRequest request) throws Exception {

              

               System.out.println("pageNo1=========ROLE_ADMIN===========>" + request.isUserInRole("ROLE_ADMIN"));

               System.out.println("pageNo1=========ROLE_USER============>" + request.isUserInRole("ROLE_USER"));

 

               return "Spring Boot : Page No 1";

        }

       

        @RequestMapping("/page2")

    public @ResponseBody String pageNo2(HttpSession session, HttpServletRequest request) throws Exception {

              

               System.out.println("pageNo2=======ROLE_ADMIN=============>" + request.isUserInRole("ROLE_ADMIN"));

               System.out.println("pageNo1=======ROLE_USER==============>" + request.isUserInRole("ROLE_USER"));

              

               return "Spring Boot : Page No 2";

        }

       

        @PreAuthorize("hasRole('ROLE_ADMIN')")

        @RequestMapping("/preRole1")

    public @ResponseBody String preRole1() throws Exception {

              

               return "@PreAuthorize : get role ROLE_ADMIN";

        }

       

        @PreAuthorize("hasRole('ROLE_USER')")

        @RequestMapping("/preRole2")

    public @ResponseBody String preRole2() throws Exception {

              

               return "@PreAuthorize : get role ROLE_USER";

        }

       

        @Secured("ROLE_ADMIN")

        @RequestMapping("/secRole1")

    public @ResponseBody String secRole1() throws Exception {

              

               return "@Secured : get role ROLE_ADMIN";

        }

 

        @Secured("ROLE_USER")

        @RequestMapping("/secRole2")

    public @ResponseBody String secRole2() throws Exception {

              

               return "@Secured : get role ROLE_USER";

        }

}


- copy coding -


DB 접속 테스트를 위한 신규 저장공간을 생성하고 사용자도 추가 하여 테이블 스페이스와 연결을 해보도록 하겠습니다.

 

1. 기존 테이블 스페이스 정보

 

테이블 스페이스 작업을 하려면 sys 계정으로 접속을 하며 접속 정보가 없다면 신규로 생성 하면 됩니다.


Oracle SQL Developer Tablespace


사진처럼 기본 값을 입력 하고 비밀번호는 디비 생성시 입력한 비밀번호를 사용 합니다테스트 버튼으로 접속을 확인 하고 저장 버튼으로 접속 정보를 저장하고 그리고 접속 버튼을 이용하여 로그인을 합니다.

 

로그인을 한 후에는 테이블 스페이스 작업을 위해 DBA 창을 열어야 합니다.


Oracle SQL Developer Tablespace


메뉴에서 보기 > DBA를 선택합니다.


Oracle SQL Developer Tablespace


좌측에 새로운 DBA 창이 추가된 것을 볼 수 있는데 여기에서 저장영역을 확장한 후 테이블스페이스를 찾아 확장을 합니다.


Oracle SQL Developer Tablespace


기존 테이블스페이스들의 사용 용량을 볼 수 있습니다어떤 식으로 설정이 되어있는지 보기 위해 상단에 있는 SYSAUX에 마우스를 놓고 우측 버튼을 클릭하고 팝업 메뉴에서 편집을 선택 합니다.


Oracle SQL Developer Tablespace


파일 사양 탭에서는 파일의 위치와 크기 등의 정보를 볼 수 있습니다.


Oracle SQL Developer Tablespace


속성 탭에도 몇가지 정보를 볼 수 있습니다.


Oracle SQL Developer Tablespace


나머지도 한번 간단히 살펴 봅니다.


Oracle SQL Developer Tablespace


설정 값들을 이용하여 신규로 테이블 스페이스를 생성할 때 참고하면 되며 파일 위치를 알았으니 한번 가서 살펴 보도록 하겠습니다


C:\ORACLEXE\APP\ORACLE\ORADATA\XE


Oracle SQL Developer Tablespace


 

2. 테이블스페이스 생성

 

기존 테이블 스페이스들이 파일로 존재하고 있고 신규로 하나 만들어 봅니다.


Oracle SQL Developer Tablespace


테이블 스페이스를 추가하기 위해 테이블 스페이스에 마우스를 놓고 우측 클릭을 하고 새로 만들기를 선택 합니다.


Oracle SQL Developer Tablespace


저는 이름을 TESTSPACE로 명명하고 파일크기는 300M, 자동 확장 설정을 체크 하여 저장한 후 다시 열어봅니다.


Oracle SQL Developer Tablespace


속성 탭을을 확인 하면 설정하지 않은 값들은 기본으로 등록됩니다파일 위치에 가면 파일이 추가된 것을 확인할 수 있습니다.


Oracle SQL Developer Tablespace



3. 사용자 생성 연결

 

새로 생성된 테이블스페이스에 사용자를 연결 하도록 합니다.


사용자를 신규로 생성해 봅니다.

 

이번엔 접속 탭에 생성한 sysdba를 확장하여 아래로 완전히 내리면 다른 사용자가 나오는데 확장을 하면 등록된 사용자들을 볼 수 있습니다.  사용자를 신규로 생성하고 테이블 스페이스와 연결하여 사용 가능하도록 합니다


Oracle SQL Developer Tablespace


다른 사용자에서 마우스 우측 버튼을 클릭 하여 사용자 생성을 선택 합니다.


Oracle SQL Developer Tablespace


사용자 이름을 적당히 입력 하고 기본 테이블스페이스에 신규로 생성한 테이블스페이스를 선택 합니다임시 테이블스페이스는 TEMP를 선택 했습니다.  부여된 롤 탭을 클릭 합니다.


Oracle SQL Developer Tablespace


부여된 롤 탭에서 CONNECT, RESOURCE를 체크하여 권한을 부여합니다할당량 탭을 클릭 합니다.


Oracle SQL Developer Tablespace


할당량에서는 TESTSPACE에 무제한으로 할당을 합니다.  SQL 탭을 클릭 합니다.


Oracle SQL Developer Tablespace


SQL 탭에서는 생성 및 설정 정보를 스크립트로 볼 수 있습니다적용 버튼을 클릭 합니다.


Oracle SQL Developer Tablespace


연결이 성공 했다는 군요.



4. 사용자 접속

 

신규로 생성한 사용자 정보를 이용하여 로그인을 해봅니다.

 

접속이름은 대충 적고 사용자 이름을 신규로 생성한 ID를 입력 합니다.


Oracle SQL Developer Tablespace


위에서 한것과 동일 하게 테스트 버튼 -> 저장 버튼 -> 접속 버튼 순으로 클릭 합니다.


Oracle SQL Developer Tablespace


TEMPUSER TESTSPACE에 접속이 성공 되었습니다아직은 테이블도 뷰도 아무것도 없는 상태입니다.  TableData를 마음대로 생성하고 삭제하면서 테스트 해 보세요.


1

+ Recent posts