μ€νλ§ μν리ν°λ‘ μ¬μ©μ κΆν μ€μ νκΈ°
λΆμ : νμ κ΄λ¦¬ κ·Έ λλμ μ₯λ²½! λ‘κ·ΈμΈ λ§λ§νκ² λ³Όκ² μλλ€β¦^^
Spring Security Framework
μΌλ° μ¬μ©μ, κ΄λ¦¬μ, κ°λ°μ μ΄λ κ² 3κ° κ·Έλ£Ήμ κ³μ κ΄λ¦¬λ₯Ό ν΄μΌνλ€κ³ κ°μ νμ. κ° μ¬μ©μλ μμ μ κΆν λ²μ μ΄λ΄μμ μ κ·Όμ΄ νμ©λμ΄μΌ νλ€. λ³΄ν΅ μΌλ° μ¬μ©μ < κ΄λ¦¬μ < κ°λ°μ μμΌλ‘ λμ κΆνμ κ°κ³ μκΈ°λλ¬Έμ μΌλ° μ¬μ©μκ° μ κ·Όνλ©΄ μ λλ νμ΄μ§λ κ³μ κ²μ¬λ₯Ό νκ³ λλ €λ³΄λ΄μΌ νλ€.
μ΄κ²μ μμ£Όμμ£Όμμ£Ό μ½κ³ λ Όλ¦¬μ μΌλ‘ ν΄κ²°ν κ²μ΄ Spring Security νλ μμν¬λ€!
Spring Security Configure
컨νΈλ‘€λ¬μμ λ€μκ³Ό κ°μ΄ /user
, /manager
, /admin
3κ°μ§ urlλ‘ μμ²μ λ³΄λΌ κ²½μ° κ°κ° μΌλ° μ¬μ©μκΉμ§, κ΄λ¦¬μκΉμ§, κ°λ°μκΉμ§ μ κ·Ό κ°λ₯νλλ‘ κ΅¬ννκ³ μΆλ€.
/**
* 컨νΈλ‘€λ¬
*/
@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μ ν
μ΄λΈμ΄ μλ μμ±λλ€!!!!!!! μ μ§μ§ νλͺ
β¦
jpa:
hibernate:
ddl-auto: update #create update none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true
/**
* μν°ν° κ°μ²΄
*/
@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() λ©μλλ₯Ό μ¬μ μνλ€.
/**
* μνλ¦¬ν° μ€μ
*/
@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 μλ¬λ₯Ό λ°ννλ©° μλΌ, λμκ° λΌκ³ νλ€.