초기 셋팅은 일단 넘어가고
아래 처럼 Security 설정을 하도록 한다.
pom.xml이나 application.yml (초기 셋팅) 이 궁금하면 깃헙 일단 참고참고!
전체 구조
1. Model객체 생성
User.java
package com.cos.jwt.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Data;
@Data
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto increment
private long id;
private String username;
private String password;
private String roles; // USER, MANAGER, ADMIM
public List<String> getRoleList(){
if(this.roles.length() > 0 ) {
return Arrays.asList(this.roles.split(","));
}
return new ArrayList<>(); // null 방지
}
}
2. DB 접근을 위하여 Repository 생성
UserRepository.java
package com.cos.jwt.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.cos.jwt.model.User;
public interface UserRepository extends JpaRepository<User, Long>{
}
3. RestController 파일 생성
간단하게 사용할 페이지들을 맵핑해놓았다.
RestApiController.java
package com.cos.jwt.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
//@CrossOrigin // 인증이 필요하지 않은 요청만 허용
@RestController
@RequiredArgsConstructor
public class RestApiController {
@GetMapping("home")
public String home() {
return "<h1>home</h1>";
}
@PostMapping("token")
public String token() {
return "<h1>token</h1>";
}
@PostMapping("join")
public String join() {
return "<h1>회원가입완료</h1>";
}
// user, manager, admin 권한 접근 가능
@GetMapping("/api/v1/user")
public String user() {
return "user";
}
// manager, admin 권한만 접근 가능
@GetMapping("/api/v1/manager")
public String manager() {
return "manager";
}
// admin 권한만 접근 가능
@GetMapping("/api/v1/admin")
public String admin() {
return "admin";
}
}
4. CorsConfig 생성
이 필터를 거치면 cors 정책에서 벗어날 수 있다.
(cross origin 요청이 와도 다 허용이 되도록 설정)
Controller에 @CrosOrigin 을 걸어도 되지만 인증이 필요한 요청은 거부된다.
package com.cos.jwt.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 내 서버가 응답을 할 때 json을 자바스크립트에서 처리할 수 있게 할지 설정
config.addAllowedOriginPattern("*"); // 모든 ip에 응답을 허용
config.addAllowedHeader("*"); // 모든 header에 응답을 허용
config.addAllowedMethod("*"); // (post,get,put,delete,patch) http method의 모든 응답 허용
source.registerCorsConfiguration("/api/**", config);
return new CorsFilter(source);
}
}
5. SecurityConfig.java 생성
Spring Sevuciry Filter Chain을 사용하기 위하여 WebSecurityConfigurerAdapter 를 상속받아주고
Configure 를 override하여 Security 설정을 해준다.
@Configuration : 해당 설정 파일을 Bean에 등록하는 어노테이션, 스프링에서 관리하게 함. => 싱글톤 유지
@EnableWebSecurity : 스프링 시큐리티 사용을 위한 어노테이션
package com.cos.jwt.config;
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;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.web.filter.CorsFilter;
import lombok.RequiredArgsConstructor;
@Configuration // IoC
@EnableWebSecurity // Security 활성화
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final CorsFilter corsFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // seession방식 사용 x , stateless server로 사용.
.and()
.addFilter(corsFilter) // @CrossOrigin은 인증x, 시큐리티 필터에 등록 인증o
.formLogin().disable() // jwt server니까 form login 사용 x
.httpBasic().disable() // 기본적인 Http 도 안씀
.authorizeRequests()
.antMatchers("/api/v1/user/**").access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/manager/**").access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
.antMatchers("/api/v1/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll();
}
}
localhost:8080/home -> 잘뜸
localhost:8080/api/v1/user -> 403 권한 없음 에러
localhost:8080/api/v1/manager -> 403 권한 없음 에러
localhost:8080/api/v1/admin -> 403 권한 없음 에러
reference
'공부 > Spring Security' 카테고리의 다른 글
[Security] JWT생성과 로그인, 권한 관리 (0) | 2022.06.28 |
---|---|
[Security] 전체적으로 (0) | 2022.04.22 |
[Security] 환경설정 (0) | 2022.03.09 |
댓글