@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)에 던져서 세션이 만들어진다.
패스워드는 스프링이 따로 가져간다.
코딩을 한번 해야되기 때문에
/*
시큐리티가 대신 로그인해주는데 password를 가로채기할때 해당 password가 뭘로 해쉬가 되어
회원가입이 되었는지 알아야, 로그인할 때 같은해쉬로 암호화해서 db에있는 해쉬랑 비교할 수있음
*/
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(principalDetailService).passwordEncoder(encodePWD());
}
AuthenticationManagerBuilder작동을해서
userDetailsService에 passwordEncoder는 encodePWD()라고 그래서 AuthenticationManagerBuilder는 패스워드가 뭘로 암호화가 되었는지 알 수 있다.
해당 유저를 찾는건 userDetailsService가 하고
패스워드 비교는 AuthenticationManager가 해준다.
BCryptPasswordEncoder로 인코딩해서 패스워드 비교를 한다.
그리고 세션에 저장하는 역할을 하고 있다.
//생성자 주입
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);
}
update : function(){
let data = {
id : $("#id").val(), //어떤회원이 수정했는지 확인하기 위해서
username: $("#username").val(), //추가
password: $("#password").val(), //패스워드받
email: $("#email").val() //이메일받기
};
}
angela@naver.com로 변경을 하면 로그아웃을 안해도 자동 저장되는걸 볼 수 있다.!