YeaLow
article thumbnail

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

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

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

 

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

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

 

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

  • ์ˆ˜์ •์ด๋ฏ€๋กœ PUT ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
 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 ๋“ฑ๋ก

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

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

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

 

profile

YeaLow

@YeaLow

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