helloworld
jwt를 위한 강제 로그인 본문
UsernamePasswordAuthenticationFilter 를 상속받은 JwtAuthenticationFilter 클래스에서 attemptAuthentication과 successfulAuthentication을 overried 하였다.
attemptAuthentication 여기에서는 username과 password를 받아서 파싱을 한 후 UsernamePasswordAuthenticationToken 에 집어넣는다.
그 후에는 PrincipalDetailsService 의 loadUserByUsername()함수가 실행되고, 정상이면 (db에 있는 username과 password가 일치하면) authentication이 리턴된다.
그 후 authentication을 PrincipalDetails에 다운캐스팅하여 넣고 로그에 찍어보면 로그인이 됐는지 확인 할 수 있다.
authentication 객체를 session 영역에 저장해야하고 그 방법이 return 해주는 것이다.
리턴의 이유는 권한관리를 springsecurity가 대신 해주기때문에 편하게 하려고 하는것이다.
굳이 jwt토큰을 사용하면서 세션을 만들 이유는 없지만 권한처리를 위해 session영역에 넣어주는 것이다.
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
System.out.println("JwtAuthenticationFilter : 로그인 시도중");
//1. username, password 받아서
try {
// BufferedReader br = request.getReader();
// String input = null;
// while((input = br.readLine()) != null)
// System.out.println(input);
// System.out.println(request.getInputStream().toString());
ObjectMapper om = new ObjectMapper(); //json 데이터 파싱
Users users = om.readValue(request.getInputStream(), Users.class);
System.out.println("users = " + users);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(users.getUsername(), users.getPassword());
//PrincipalDetailsService의 loadUserByUsername() 함수가 실행된 후 정상이면 authentication이 리턴됨
// db에 있는 username 과 password 가 일치
Authentication authentication = authenticationManager.authenticate(authenticationToken);
PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("principalDetails : " + principalDetails.getUsers().getUsername());//로그인 완료
// authentication 객체가 session 영역에 저장해야하고 그 방법이 return 해주면 됨
// 리턴의 이유는 권한 관리를 security가 대신 해주기 때문에 편하려고 하는거임.
// 굳이 jwt 토큰을 사용하면서 세션을 만들 이유는 없음. 근데 단지 권한처리때매 session을 넣어줌
return authentication;
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
//로그창
users = Users(id=0, username=ssar, password=1234, roles=null)
PrincipalDetailsService의 loadUserByUsername()
Hibernate: select users0_.id as id1_0_, users0_.password as password2_0_, users0_.roles as roles3_0_, users0_.username as username4_0_ from Users users0_ where users0_.username=?
principalDetails : ssar
//
아직 너무너무 어렵다 ㅠ
successfulAuthentication는 위의 함수에서 인증이 정상적으로 되었으면 실행되는 함수이다.
jwt토큰을 만들어서 request 요청한 사용자에게 jwt토큰을 response해주는 함수를 만들ㅇ ㅖ정이다.
'jwt' 카테고리의 다른 글
| jwt토큰 만들어서 응답해주기 (0) | 2023.10.20 |
|---|---|
| jwt 임시 토큰 만들어보기 (2) | 2023.10.19 |
| JWT 를 위한 Security 설정 (0) | 2023.10.19 |
| JWT 구조 이해 (2) | 2023.10.18 |
| RFC 문서 (0) | 2023.10.18 |