Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링
- QueryDSL
- kotlin
- Greedy
- 백준
- JDBC
- http
- transaction
- Spring Boot
- db
- Android
- 스프링 핵심 원리
- SpringBoot
- java
- pointcut
- AOP
- 자바
- 김영한
- 알고리즘
- 스프링 핵심 기능
- spring
- Thymeleaf
- springdatajpa
- Servlet
- JPQL
- Exception
- 그리디
- Proxy
- 인프런
- jpa
Archives
- Today
- Total
개발자되기 프로젝트
인증처리 - 본인이 작성한 것만.. 본문
1. 요구사항
- 본인이 작성한 글만 수정, 삭제가 가능해야 한다.
- 본인이 작성한 댓글만 삭제가 가능해야 한다.
2. 로직 컨셉.
- 버튼을 통해 접속하는 경우 차단
- 해당 글에 대한 수정/삭제 권한이 없는 경우 => post.member.id가 member.id 와 다른 경우
- memberDto.authority에 "nonAuthorized"추가.
- 각 뷰에서 권한 판단이 필요할 경우 ${member.authority}를 사용하여 수정/삭제 버튼을 비활성화 시킴.
- url을 통한 직접 접속
- Session에서 로그인 정보를 가져왔을 때
- session에 로그인 유저의 정보가 없거나, 유저의 authority가 nonAuthorized인 경우 목록으로 redirect시켜버림.
3. PostController
- loginMember가 권한이 있는지 확인하는 메서드를 추가.
- 인증이 필요한 메서드에 hasNoAuthority()를 추가해 주자.
@GetMapping("/{postId}/edit")
public String editForm(@PathVariable("postId") Long postId, HttpServletRequest request, Model model){
MemberDto loginMemberDto = getLoginMember(request);
if (hasNoAuthority(loginMemberDto)) return "redirect:/posts";
getLoginMemberAndAddToModel(request, model);
PostDto postDto = postService.findPostById(postId).postToDto();
model.addAttribute("post", postDto);
return "post/editform";
}
private boolean hasNoAuthority(MemberDto loginMemberDto) {
if (loginMemberDto == null || loginMemberDto.getAuthority().equals(Authority.nonAuthorized)) {
return true;
}
return false;
}
4. View
- 글 수정, 삭제버튼
<form th:action="@{/posts/{postId}/delete(postId=${post.id})}" method="post">
<button class="btn btn-primary" type="button"
th:disabled="${member.authority}=='nonAuthorized'"
th:onclick="|location.href='@{/posts/{postId}/edit(postId=${post.id})}'|">수정</button>
<button class="btn btn-secondary float-end" type="submit"
th:disabled="${member.authority}=='nonAuthorized'"
th:onclick="|location.href='@{/posts/{postId}/delete(postId=${post.id})}'|">삭제</button>
</form>
- 댓글 삭제 버튼
- 댓글의 경우 댓글의 작성자와 로그인 유저를 비교.
- 로그인 하지 않은 경우 member.id가 존재하지 않기 때문에 항상 true로 비활성화됨.
<form th:action="@{/comments/{commentId}/delete?postId={id}(commentId=${comment.id}, id=${post.id})}" th:object="${commentDto}" method="post">
<button type="submit" class="btn-close" aria-label="Close"
th:disabled="${member.id} != ${comment.member.id}"></button>
</form>
5. 결과
- 로그인 유저가 작성하지 않은 댓글, 글은 삭제/수정이 불가능.
- 본인이 작성하지 않은 글/댓글 삭제/수정 url을 직접 접속하면 글 목록으로 redirect
- 권한이 없는 url로 접속한 결과 redirect되었다.
- delete의 경우 GET메서드가 없고 POST만 있어서 애초에 접속이 안됨 ㅋㅋㅋ
흠.. 그런데 이렇게 인증 로직을 모든 메서드에 일일히 적용해 줘야 하나.. 귀찮은데..
6. 앞으로..
est용 data 서버시작할 때 DB에 올리기Listener
createdAt, updatedAt등
게시글에 작성자 표시view 정리게시글 검색- 검색 옵션 추가 : 작성자, 제목 구분
영속성 전이 설정게시글 삭제회원 탈퇴
댓글 삭제 버튼글 수정 기능 추가- 대댓글
- 검증 & 예외처리
회원 가입시 필수 정보 지정.특수문자, 공백 검증 등(email 형식?)- Spring제공 Validator로 변경.
- 인증처리
로그인한 사용자만 글 & 댓글 작성 가능.본인이 작성한 글, 댓글만 수정/삭제 가능- 관리자는 모든 권한
- 예외처리
- 페이징 처리
- 컬렉션 조회 최적화
7. GitHub: 211013 Check Authorization
'Project > 블로그 게시판 만들기' 카테고리의 다른 글
SpringInterceptor (0) | 2021.10.15 |
---|---|
관리자 권한 (0) | 2021.10.14 |
비 로그인 사용자 처리 (0) | 2021.10.12 |
특수문자 및 공백 검증 (0) | 2021.10.12 |
회원가입시 검증 기능 추가 - 검증 직접 처리 (0) | 2021.10.12 |
Comments