[시큐리티] 유저의 권한을 변경하자
2024. 6. 12. 15:54ㆍ시큐리티
간단하게 결제 시스템을 구현해, 결제를 성공적으로 마친 유저에 대해서만 특정 페이지 접근을 허용하려 했지만 실패했다. 기본적으로 회원가입을 완료한 유저는 NOPAIDUSER 권한을 가진다.
@GetMapping("successPay")
public ModelAndView successPay(@AuthenticationPrincipal UserDetails userDetails,
HttpServletRequest request) {
String username=userDetails.getUsername();
MemberVO m= this.memberService.idCheck(username);
m.setRole("PAIDUSER");
this.memberService.update_Edit(m);
// HttpSession session = request.getSession(); // 세션 객체 생성
// session.setAttribute("id", m.getMember_id());
// session.setAttribute("name", m.getMember_name());
// session.setAttribute("auth", "ROLE_" + m.getRole());
//위 방법으론 권한 업데이트가 되지 않음.
//System.out.println(m.getMember_id()+m.getMember_name()+m.getRole());
결제가 완료된 유저의 권한을 새로 저장하려고 시도한 첫번째 방법이다.
NOPAIDUSER -> PAIDUSER
세션이 가진 속성을 변경할 수는 있겠지만, 현재 인증된 사용자의 권한을 반영하는 작업이 이루어지지 않았다.
인증 객체(auth)를 가져와야만 제대로 된 업데이트를 반영할 수 있다.
/*로그아웃을 위한 jsp 파일을 따로 만들었듯이, 결제가 완료되면 쥐도 새도 모르게 로그아웃을 시키고 다시 로그인을 해놓으면 어떨까 했지만, 로그아웃을 진행한 유저의 정보를 가지고 다시 로그인하는 과정은 올바르지 않다는 판단을 내렸다. */
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
List<GrantedAuthority> updatedAuthorities = new ArrayList<>(auth.getAuthorities());
updatedAuthorities.remove(new SimpleGrantedAuthority("ROLE_NOPAIDUSER"));
updatedAuthorities.add(new SimpleGrantedAuthority("ROLE_PAIDUSER"));
Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(), updatedAuthorities);
SecurityContextHolder.getContext().setAuthentication(newAuth);
//결제 시 권한을 업데이트해서 접근할 수 없는 페이지에 접근을 가능하게 해야해서, 현재 접속중인 유저 정보를 업데이트.
DB 설계에 따라 remove과정이 필요하지 않을 수 있다.
새로운 방법을 스스로 고민해보는 건 훌륭한 학습법이지만, 때로는 ... 이미 구현된 방법이 있을 수 있으니(우리의 고민거리는 생각보다 대단하지 않을 때가 많다) 관련 메서드를 찾아보는 것도 좋을 것 같다.
'시큐리티' 카테고리의 다른 글
[시큐리티] 스프링 부트에서 시큐리티 적용 (0) | 2024.05.31 |
---|