Mozzida
article thumbnail

1. ๐Ÿค์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security) ํšŒ์›์ •๋ณด ์ˆ˜์ • ๊ตฌํ˜„ํ•˜๊ธฐ

1. ๋จผ์ € ํšŒ์› ์ •๋ณด ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ UserController์— ์ž‘์„ฑํ•œ๋‹ค.

<java />
@GetMapping("/user/updateForm") public String updateForm() { return "user/updateForm"; }

 

2. ํšŒ์› ์ •๋ณด ์ˆ˜์ • ํ™”๋ฉด updateForm์„ ์ž‘์„ฑํ•œ๋‹ค.

  • username์€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก readonly๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
  • userid๋Š” hidden ์†์„ฑ์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  • user ์ •๋ณด๋Š” principal์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

 

3. ํšŒ์› ์ •๋ณด ์ˆ˜์ • ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ user.js์— ์ž‘์„ฑํ•œ๋‹ค.

  • ์ˆ˜์ •์ด๋ฏ€๋กœ PUT ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
<javascript />
let index = { init: function(){ $("#btn-update").on("click",()=>{ //function(){} ๋Œ€์‹  ()=>{} : this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ this.update(); }); }, update: function(){ //alert('user์˜ saveํ•จ์ˆ˜ ํ˜ธ์ถœ๋จ'); let data = { id: $("#id").val(), username: $("#usename").val(), password: $("#password").val(), email: $("#email").val(), }; $.ajax({ //ํšŒ์›์ •๋ณด ์ˆ˜์ • ์š”์ฒญ type: "PUT", url: "/user", data: JSON.stringify(data), //http body ๋ฐ์ดํ„ฐ contentType: "application/json; charset=utf-8", //body ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€(MIME) dataType: "json" //์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ํ•ด์„œ ์‘๋‹ต์ด ์™”์„ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๋ฌธ์ž์—ด(String)=>javascript ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝ //์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ผ ๋•Œ }).done(function(resp){ alert("ํšŒ์›์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); //console.log(resp); location.href="/"; //์‹คํŒจ์ผ ๋•Œ }).fail(function(error){ alert(JSON.stringify(error)); }); } } index.init();

 

4. UserService ์ž‘์„ฑ

  • @Transactional ์ ์šฉ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ์ธ์ฝ”๋”ฉ ์ „ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ์ธ์ฝ”๋”ฉ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ๊ณ  ๊ทธ๊ฒƒ์„ User ์ •๋ณด๊ฐ€ ๋‹ด๊ธด persistance์— ๋‹ด๋Š”๋‹ค.

5. UserApiController ์ž‘์„ฑ

 

๐Ÿ’ก์—ฌ๊ธฐ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋ฉด DB์—๋Š” ๋ณ€๊ฒฝ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ฐ˜์˜๋˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—” ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ์•„์›ƒ ํ›„ ์žฌ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ๋ฐ˜์˜๋œ๋‹ค.

๐Ÿ’ก๊ทธ ์ด์œ ๋Š” ์„œ๋น„์Šค ์ฝ”๋“œ๊ฐ€ ์ ์šฉ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— DB ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ์„ธ์…˜๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋กœ ์„ธ์…˜๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ๋Š” ์„ธ์…˜๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ์— ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  • SecurityContextHolder ์•ˆ์˜ SecurityContext ์•ˆ์— Authenitication ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ -> ์„ธ์…˜ ๊ฐ’์ด ์ €์žฅ๋œ ์ƒํƒœ!
  • ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ์˜ค๋ฉด AuthenticationFilter๋ฅผ ๊ฑฐ์ณ์„œ UsernamePasswordAuthenticationToken์„ ๋งŒ๋“ฆ.
  • AuthenticationManager๊ฐ€ ๊ทธ๋ƒฅ username,password๊ฐ€ ์•„๋‹Œ ํ† ํฐ์„ ๋ฐ›์•„์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ฆ.
  • ์ผ๋‹จ username๋งŒ ๋“ค์–ด์˜ค๊ณ  ํ•ด๋‹น user๊ฐ€ DB์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์œผ๋ฉด principal์— ๋˜์ ธ์„œ ์„ธ์…˜์„ ๋งŒ๋“ค์–ด์คŒ.
  • password๋Š” ์Šคํ”„๋ง์ด ๋”ฐ๋กœ ๊ฐ€์ ธ๊ฐ€์„œ ์ธ์ฝ”๋”ฉ์„ ๊ฑฐ์ณ์•ผํ•จ.

6. SecurityConfig ํด๋ž˜์Šค์— @Bean ๋“ฑ๋ก

<java />
@Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { // TODO Auto-generated method stub return super.authenticationManagerBean(); }

7. UserApiController์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜๋ฉด ๋!

<java />
Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword())); SecurityContextHolder.getContext().setAuthentication(authentication); return new ResponseDto<Integer>(HttpStatus.OK.value(),1);

 

profile

Mozzida

@Mozzida

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!