μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°λ‘œ μ‚¬μš©μž κΆŒν•œ μ„€μ •ν•˜κΈ°

λΆ€μ œ : νšŒμ› 관리 κ·Έ λ“œλ†’μ€ μž₯λ²½! 둜그인 λ§Œλ§Œν•˜κ²Œ 볼게 μ•„λ‹ˆλ‹€β€¦^^

Spring Security Framework

일반 μ‚¬μš©μž, κ΄€λ¦¬μž, 개발자 μ΄λ ‡κ²Œ 3개 그룹의 계정 관리λ₯Ό ν•΄μ•Όν•œλ‹€κ³  κ°€μ •ν•˜μž. 각 μ‚¬μš©μžλŠ” μžμ‹ μ˜ κΆŒν•œ λ²”μœ„ μ΄λ‚΄μ—μ„œ 접근이 ν—ˆμš©λ˜μ–΄μ•Ό ν•œλ‹€. 보톡 일반 μ‚¬μš©μž < κ΄€λ¦¬μž < 개발자 순으둜 넓은 κΆŒν•œμ„ κ°–κ³  μžˆκΈ°λ•Œλ¬Έμ— 일반 μ‚¬μš©μžκ°€ μ ‘κ·Όν•˜λ©΄ μ•ˆ λ˜λŠ” νŽ˜μ΄μ§€λŠ” 계정 검사λ₯Ό ν•˜κ³  λŒλ €λ³΄λ‚΄μ•Ό ν•œλ‹€.

이것을 μ•„μ£Όμ•„μ£Όμ•„μ£Ό 쉽고 λ…Όλ¦¬μ μœΌλ‘œ ν•΄κ²°ν•œ 것이 Spring Security ν”„λ ˆμž„μ›Œν¬λ‹€!

Spring Security Configure

μ»¨νŠΈλ‘€λŸ¬μ—μ„œ λ‹€μŒκ³Ό 같이 /user, /manager, /admin 3가지 url둜 μš”μ²­μ„ 보낼 경우 각각 일반 μ‚¬μš©μžκΉŒμ§€, κ΄€λ¦¬μžκΉŒμ§€, κ°œλ°œμžκΉŒμ§€ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ κ΅¬ν˜„ν•˜κ³  μ‹Άλ‹€.

Java
/**
 * 컨트둀러
 */

@Controller
public class IndexController {
    @GetMapping({"", "/"})
	public String index() {
		// mustache κΈ°λ³Έ 폴더 : src/main/resources/
		// viewResolver μ„€μ • : templates (prefix), .mustache (suffix)   // μƒλž΅ κ°€λŠ₯
		return "index";    // src/main/resources/templates/index.mustache 둜 작음
	}
	
	@GetMapping("/user")
	public @ResponseBody String user() {
		return "user";
	}
	
	@GetMapping("/admin")
	public @ResponseBody String admin() {
		return "admin";
	}
	
	@GetMapping("/manager")
	public @ResponseBody String manager() {
		return "manager";
	}
}

개체 μƒμ„±ν•˜κΈ°

νšŒμ› 관리 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” β€˜μ‚¬μš©μžβ€™μ΄λΌλŠ” κ°œλ…μ„ β€˜Userβ€™λΌλŠ” 객체 νƒ€μž…μœΌλ‘œ 생성해야 ν•œλ‹€. model νŒ¨ν‚€μ§€λ₯Ό μƒμ„±ν•œ λ’€ μ—”ν‹°ν‹° 클래슀λ₯Ό λ§Œλ“€μ–΄μ£Όμž.

μž¬λ°ŒλŠ” 것은 μ—”ν‹°ν‹° 클래슀λ₯Ό μƒμ„±ν•˜λ©΄ application.yml(application.properties) hibernate 섀정에 μ˜ν•΄ DB에 ν…Œμ΄λΈ”μ΄ μžλ™ μƒμ„±λœλ‹€!!!!!!! 와 μ§„μ§œ 혁λͺ……

yml
jpa:
    hibernate:
        ddl-auto: update #create update none
        naming:
            physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
Java
/**
 * μ—”ν‹°ν‹° 개체
 */

@Entity
@Data
public class User {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private String username;
	private String password;
	private String email;
	private String role;   // ROLE_USER, ROLE_ADMIN
	// 휴면 계정 섀정을 μœ„ν•œ 둜그인 λ‚ μ§œ ν•„λ“œ
	// private Timestamp loginDate;
	@CreationTimestamp
	private Timestamp createDate;
}

configure() λ©”μ„œλ“œ μ •μ˜ν•˜κΈ°

이제 본격적으둜 μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° 섀정을 ν•΄λ³΄μž. config νŒ¨ν‚€μ§€ 내뢀에 SecurityConfig 클래슀λ₯Ό μƒμ„±ν•œλ‹€.

이후 클래슀 λ ˆλ²¨μ— @Configuration, @EnableWebSecurity μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„€μ •ν•΄ μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°λ₯Ό μœ„ν•œ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•œλ‹€.

λ‹€μŒμœΌλ‘œ configure() λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œλ‹€.

Java
/**
 * μ‹œνλ¦¬ν‹° μ„€μ •
 */

@Configuration
@EnableWebSecurity    // μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° ν•„ν„°κ°€ μŠ€ν”„λ§ ν•„ν„° 체인에 등둝됨
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.csrf().disable();
		http.authorizeRequests()
			.antMatchers("/user/**").authenticated()    // 인증이 된 λͺ¨λ“  계정이 λ“€μ–΄κ°ˆ 수 μžˆλŠ” μ£Όμ†Œ
			.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
			.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
			.anyRequest().permitAll();
	}
}

μœ„μ˜ 섀정은 λ‹€μŒμ„ μ˜λ―Έν•œλ‹€.

  • antMatchers("/user/**").authenticated() : 인증이 된 λͺ¨λ“  μ‚¬μš©μžλŠ” /user μš”μ²­μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.
  • .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") : DB 내에 역할이 β€˜ROLEADMIN’ λ˜λŠ” β€˜ROLEMANAGERβ€™λ‘œ μ €μž₯된 경우만 /manager μš”μ²­μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€.
  • .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") : DB 내에 역할이 β€˜ROLE_ADMINβ€™μœΌλ‘œ μ €μž₯된 경우만 /admin μš”μ²­μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλ‹€. -.anyRequest().permitAll(); : μ΄μ™Έμ˜ λ‹€λ₯Έ 경둜둜 λ“€μ–΄μ˜¨ μš”μ²­μ€ κΆŒν•œ 인증 없이 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

μŠ€ν”„λ§ ν”„λ‘œμ νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ 각 κΆŒν•œμ— λ§žλŠ” νŽ˜μ΄μ§€ μš”μ²­λ§Œ ν—ˆμš©ν•˜λŠ” 것을 확인할 수 μžˆλ‹€! λ§Œμ•½ κΆŒν•œ λ²”μœ„ λ°–μ˜ νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•  경우 403 μ—λŸ¬λ₯Ό λ°˜ν™˜ν•˜λ©° μ•ˆλΌ, λŒμ•„κ°€ 라고 ν•œλ‹€.



Reference

μΈν”„λŸ° μ΅œμ£Όν˜Έλ‹˜ μŠ€ν”„λ§λΆ€νŠΈ μ‹œνλ¦¬ν‹° & JWT κ°•μ˜ - μ„Ήμ…˜ 0. μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° κΈ°λ³Έ