[Spring JPA ] - 회원수정 - 16(세션값 강제로 변경시키기)

JEONG SUJIN·2022년 11월 26일
0

스프링부트 JPA

목록 보기
17/24

세션이 만들어지는 과정

PrincipalDetailService.java

@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		System.out.println("@@@@@@@@@@@@@ PrincipalDetailService :: " );
		
		User principal= userRepository.findByUsername(username).orElseThrow(()-> {
					System.out.println("@@@@userRepository ");	
			return new UsernameNotFoundException("해당사용자를 찾을 수 없습니다. " + username);
		});
		
		System.out.println("principal ::: " + principal);
		return new PrincipalDetail(principal); //시큐리티세션에 유저정보가 저장이 됨
	}

UsernamePasswordAuthenticationToken 이 PrincipalDetailService들어온다.
근데 username만 들어와서 해당 유저로 해당데이터베이스에 사용자가 있는지 확인하고
있으면 PrincipalDetail(principal)에 던져서 세션이 만들어진다.

패스워드는 스프링이 따로 가져간다.
코딩을 한번 해야되기 때문에

SecurityConfig.java

/* 
시큐리티가 대신 로그인해주는데 password를 가로채기할때 해당 password가 뭘로 해쉬가 되어
회원가입이 되었는지 알아야, 로그인할 때 같은해쉬로 암호화해서 db에있는 해쉬랑 비교할 수있음
*/
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
		auth.userDetailsService(principalDetailService).passwordEncoder(encodePWD());
	}

AuthenticationManagerBuilder작동을해서

userDetailsService에 passwordEncoder는 encodePWD()라고 그래서 AuthenticationManagerBuilder는 패스워드가 뭘로 암호화가 되었는지 알 수 있다.

해당 유저를 찾는건 userDetailsService가 하고
패스워드 비교는 AuthenticationManager가 해준다.
BCryptPasswordEncoder로 인코딩해서 패스워드 비교를 한다.

그리고 세션에 저장하는 역할을 하고 있다.

UserApiController.java

//생성자 주입
private final PrincipalDetailService principalDetailService;

@PutMapping("/user")
	public ResponseDto<Integer> update(@RequestBody User user, HttpSession session){

//세션등록
		UserDetails userDetail = principalDetailService.loadUserByUsername(user.getUsername());
		Authentication authentication = new UsernamePasswordAuthenticationToken(userDetail, null, userDetail.getAuthorities());
		SecurityContext securityContext = SecurityContextHolder.getContext();
		securityContext.setAuthentication(authentication);
		session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
}      
        

user.js

update : function(){
 let data = {
			id : $("#id").val(), //어떤회원이 수정했는지 확인하기 위해서
			username: $("#username").val(), //추가
			password: $("#password").val(), //패스워드받
			email: $("#email").val() //이메일받기
		};
    
}

angela@naver.com로 변경을 하면 로그아웃을 안해도 자동 저장되는걸 볼 수 있다.!

profile
기록하기

0개의 댓글