[시큐리티] 유저의 권한을 변경하자

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