작성
·
306
0
시큐리티를 적용하지 않고 JSP나 스프링으로 게시판을 만들때 자기가 작성한 글과 댓글만 수정하도록 하려면
로그인 성공하면 세션에 id값을 저장하고
게시글에 해당하는 model에 세션에 저장한 id를 넣어서 나중에 view단에서 서로 일치하면
글,수정 버튼이 보이는 방식으로 만들었는데 혹시 시큐리티를 통해서는 이런 방식과 다르게 적용할수도 있을까요
현업에서는 어떻게 하는지 궁금합니다
답변 2
1
처리 방식은 비슷하겠지만 특정한 값을 세션에 저장하고 참조하는 방식이 아닌 스프링 시큐리티의 인증 정보를 활용하는 방식으로 처리하면 됩니다.
첫번째 예시
클라이언트나 서버 모두 현재 로그인한 사용자의 인증 정보를 SecurityContext 에서 참조해서 로직에 활용
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
String username = null;
if(principal != null && principal instanceof User){
username = ((User) principal).getUsername();
}
두번째 예시
View 단이 아닌 서버단에서 인증 및 본인여부를 체크하여 보호하고자 하는 메서드의 실행여부를 결정할 수 도 있습니다.
즉 View 단에서 아무 사용자가 본인의 글에 대하여 수정 요청을 할 경우라도 서버단에서 권한을 체크하는 방식입니다.
// 로그인한 사용자이고 본인인 경우나 혹은 전체 관리자인 경우 수정 메서드가 실행되고 그렇지 않을 경우엔
// 403 에러 발생함
@PreAuthorize("isAuthenticated() and (( #user.name == principal.name ) or hasRole('ROLE_ADMIN'))")
@RequestMapping( value = "", method = RequestMethod.PUT)
public ResponseEntity<Message> updateUser(User user ){
messageService.updateMessage( "메시지 저장");
return new ResponseEntity<Message>( new Message("수정성공"), HttpStatus.OK );
}
세번째 예시
View 단에서 시큐리티 표현식 문법을 사용해서 권한제어를 할 수도 있겠죠
<sec:authentication var="principal" property="principal"/>
<c:if test="${principal eq 게시글 아이디}">
수정하기버튼
</c:if>
기억하실 점은 스프링 시큐리티의 인증 및 인가정보를 어디에서, 어떻게 참조하는지의 방법을 명확하게 이해하는 것입니다.
0