유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.
IDE : IntelliJ
언어 : Java 8
스프링부트 버전 : 2.7.13
DB : MySQL
빌드관리 도구 : Maven
OS : iOS
참고유튜브 : 메타코딩
저번글에 이어서 권한을 위해서 정보를 세션에 저장하기 위해서 강제로 로그인하는 기능을 작성해보자.
JwtAuthenticationFilter로 이동해서 body값에서 넘어오는 값을 한 번 받아보자.
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
System.out.println("로그인 시도중");
try {
BufferedReader br = request.getReader();
String input = null;
while ((input=br.readLine()) != null){
System.out.println("attemptAuthentication input : "+input);
}
} catch (IOException e) {
throw new RuntimeException();
}
return null;
}
값을 넣어주면 body에서 넘겨준 값들이 잘 넘어오는걸 확인 할 수 있다.
이제 해당 값들을 기준으로 db에서 유저정보를 select를 해서 세션에 저장해주면 된다.
username 과 password를 좀 더 간단하게 받아 주기 위해서 ObjectMapper를 이용해서 받아온 데이터를 파싱해주면 된다.
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(request.getInputStream(), User.class);
System.out.println("user test : "+ user);
콘솔에서 확인을 해보면 받아온 데이터를 user에 저장이 된 걸 확인할 수 있다.
이제 해당 정보를 가지고 db에서 회원의 정보를 불러와보자.
user에 저장된 username 과 password를 이용해
PrincipalDetailsService에 loadUserByUsername의 함수가 실행이 되어서 정상적인 회원의 정보라면 authentication을 리턴해준다.
정상적으로 세션에 정보가 저장되었는지 확인해보기 위해서 PrincipalDetails로 형변환을 한 후 값을 출력해보면 db에 있던 유저의 정보가 출력되는걸 확인할 수 있다.
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());
Authentication authentication = authenticationManager.authenticate(authenticationToken);
PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("principalDetails test(login check) : "+principalDetails.getUser());
return authentication;
select 함수가 실행이 되면서 변수명 principalDeatails에 해당 유저의 정보가 저장된걸 확인할 수 있다.
즉 세션에 해당유저의 정보가 저장이 되었고 roles에서 일반유저인것도 확인할 수 있다.
이제 세션에 저장된 유저의 정보에서 roles에 따라서 접근할 수 있는 주소를 다르게 할 수 있다.
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final AuthenticationManager authenticationManager;
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
System.out.println("로그인 시도중");
try {
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(request.getInputStream(), User.class);
System.out.println("user test : "+ user);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(user.getUsername(),user.getPassword());
Authentication authentication = authenticationManager.authenticate(authenticationToken);
PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("principalDetails test(login check) : "+principalDetails.getUser());
return authentication;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
'프로젝트 > SpringSecurity' 카테고리의 다른 글
[Spring Security] 17. JWT 받아서 유효성 검사하기 (0) | 2023.07.20 |
---|---|
[Spring Security] 16. JWT응답(Response)해주기 (0) | 2023.07.19 |
[Spring Security] 14. JWT를 이용해 로그인전 회원가입 및 db관련 수정사항 (0) | 2023.07.18 |
[Spring Security] 13. JWT를 이용해 로그인 테스트하기 (0) | 2023.07.17 |
[Spring Security] 12. JWT를 이용하기위한 임시토큰만들어 테스트해보기 (0) | 2023.07.12 |
댓글