Spring Boot를 이용하여 security를 적용하는 방법을 연습해 봅니다.
먼저 프로젝트를 생성해야 테스트를 진행 하겠죠.
상단 메뉴에서 File > New > Spring Starter Project를 이용하여 프로젝트를 생성해도 됩니다.
프로젝트 정보는 테스트용이라 대충 적었습니다.
필요한 라이브러리는 Spring Security만 설명할거기 때문에 복잡하지 않도록 Spring Security와 Spring Web만 선택 했습니다. 그리고 Finish 버튼을 클릭 하면 자동으로 필요한 라이브러리를 추가하고 기본 소스를 생성 합니다.
자동으로 생성된 프로젝트를 실행 해 볼까요?
Spring Boot App을 선택해서 실행을 합니다.
로그인 화면이 나오는데 ID는 security에서 제공하는 초기값이 user 이고 비밀 번호는 Console 창에 출력을 해줍니다.
이렇게 console 창에 비밀번호가 나타납니다. 복사해서 비밀번호 입력을 하고 Sign in 버튼을 클릭하면 로그인이 진행 됩니다.
오류 메시지가 나오는군요. 그럼 로그인 성공 입니다.
가야할 페이지가 없어서 나오는 오류 입니다. 프로젝트만 생성하고 화면 작업을 하나도 안했죠.
그럼 갈곳을 정해주고 다시 해봅니다.
Controller 파일을 하나 생성하고
package com.copycoding.security; 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"; } } |
@RestController 어노테이션을 사용합니다. 화면 만들기 귀찮아 텍스트를 바로 화면으로 출력하도록 했습니다. 홈페이지에 가려고 하는 경우 Spring Boot를 출력하도록 했습니다. 이러면 로그인 하고 여기로 오겠죠.
다시 프로젝트를 실행하고 로그인을 해봅니다.
로그인 성공입니다.
이번에는 페이지를 여러개 만들어서 테스트 합니다.
package com.copycoding.security;
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() throws Exception {
return "Spring Boot : Page No 1"; }
@RequestMapping("/page2") public @ResponseBody String pageNo2() throws Exception {
return "Spring Boot : Page No 2"; } } |
프로젝트를 실행해서 로그인 하고 각 페이지에 접근해 봅니다.
또 성공입니다. 로그인만 되면 아무 페이지나 막 갈 수 있습니다. 이러려고 Spring Security를 사용하는게 아니죠?
이번엔 갈 수 있는 페이지와 없는 페이지를 한정해 봅니다. 그러려면 class 파일을 하나 만들어야 합니다. 파일에 Security Config를 설정해서 테스트를 진행 합니다.
클래스를 하나 생성 하는데 상속을 받아서 생성을 해야 합니다.
바로 WebSecurityConfigurerAdapter를 찾아서 상속 관계를 만들어 줍니다. 생성하는 파일명은 편하게 만들면 되고 파일이 만들어 지면 상속된 클래스로 부터 Method 리스트를 찾아 추가해야 합니다.
Method 중에 configure(HttpSecurity http)를 선택하여 추가해 줍니다. 찾기 귀찮으면 그냥 직접 입력 해서 사용 합니다.
package com.copycoding.security; import org.springframework.context.annotation.Configuration; 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; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/page2").hasRole("ADMIN") .antMatchers("/page1").hasRole("USER") .anyRequest().authenticated(); } } |
Method가 추가 되면 페이지별 권한을 설정 합니다.
“/”는 로그인 하면 접근이 가능하고 다른 페이지 “page1”, “page2”는 아래와 같이 접속 하려면 오류가 발생 합니다.
잠시 Postman으로 설명을 하면
“/”는 접근이 가능 하지만
이렇게 “/page1”, “/page2”는 ADMIN 과 USER 권한이 있어야 접속이 가능하므로 “Access Denied” 오류가 발생 합니다.
이제 ADMIN 과 USER 권한이 있는 로그인 정보를 source에 추가해서 테스트 해보겠습니다.
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.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 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(); } } |
“/”는 아무나 접근 가능 합니다.
“/page2”는 “ADMIN” 권한이 있어야 하는데 아래에 id/pw가 “copycoding”, ”copycopy” 이고
“/page1”는 “USER” 권한으로 로그인 정보가 “honggil”, “hoho” 이면 된다고 했습니다.
Postman으로 id 와 password를 전송해서 테스트를 해 봅니다.
ADMIN 권한으로 로그인이 되어서 “/page2”에 잘 접속이 됩니다.
ADMIN 권한으로는 “/page1” 접근은 어림 없군요.
logout을 하고 honggil로 로그인 하면 반대의 결과가 나옵니다.
결과는 생략 하겠습니다.
logout은 “.and().logout().permitAll()” 이렇게 설정을 해놓았으므로 사용이 가능하고 사용하는 방법은 다음처럼 http://localhost:9090/logout 을 입력 하면 됩니다.
회원 로그인과 권한을 메모리에 넣고 사용하는 방법으로 테스트를 했는데 이걸 Database에 넣어서 관리하면 되겠네요. 그건 다음에 시간이 되면 테스트 해보겠습니다.
- copy coding -
'Framework' 카테고리의 다른 글
[Maven] JQuery, BootStrap 추가 방법 (2) | 2020.02.17 |
---|---|
[Spring Boot] Path with "WEB-INF" or "META-INF" (4) | 2020.02.15 |
[Spring Boot STS 4.5.1] MyBatis Oracle 연동 (8) | 2020.02.06 |
eclipse properties 파일 한글 깨짐 해결 설정 (9) | 2020.01.21 |
Eclipse Data Source Explorer Oracle 설정 (0) | 2019.12.14 |