Jam's story

게시판 인증구현 - 뷰 본문

Spring

게시판 인증구현 - 뷰

애플쩀 2022. 11. 13. 20:54
header.html
  <div class="text-end">
                <span id="username" class="text-white me-2">username</span>
                <a role="button" id="login" class="btn btn-outline-light me-2">Login</a>
                <a role="button" id="logout" class="btn btn-outline-light me-2"></a>
            </div>

 

header.th.sml
<?xml version="1.0"?>
<thlogic xmlns:th="http://www.thymeleaf.org">
    <attr sel="#home" th:href="@{/}"/>
    <attr sel="#hashtag" th:href="@{/articles/search-hashtag}"/>
    <attr sel="#username" sec:authorize="isAuthenticated()" sec:authentication="name"/>
    <attr sel="#login" sec:authorize="!isAuthenticated()" th:href="@{/login}"/>
    <attr sel="#logout" sec:authorize="isAuthenticated()" th:href="@{/logout}"/>
</thlogic>

 

로그인페이지에서 로그인을 하면 ,

PasswordEncoder에 id가 null로 나타났다.

PasswordEncoder는 PasswaordEncoderFactories에서 createDelegatingPasswordEncoder를 사용하는데,

패스워드 데이터 앞머리에 내용을 붙여주지 않으면 인식을 얘가 인식을 하지 못한다.

앞머리에 추가하는 내용은 바로 암호화 규칙으로 여러가지 방식으로 선택이 가능하지만, 지금은 테스트 단계이니 만큼 {noop}을 붙여서 비밀번호가 그대로 보여지게 설정한다.

 

암호화규칙을 사용하지 않은 이유는, 비밀번호를 어떤 값으로 지정했는지를 바로 볼수 없는 것이 불편하기 때문이다.

data.sql 파일에서 유저 테스트 데이터의 비밀번호 값의 앞에다가 {noop}를 추가해준다.

이렇게 해주면 로그인이 되서 게시글 페이지로 들어가게 된다.

 

로그인되면, 로그인이되고 로그아웃누르면 로그아웃 페이지로 리다이랙션된다.

 

index.th.xml

글쓰는 버튼이, 인증되었을때만 열리도록 sec:authorize="isAuthenticated()" 추가

<attr sel="#write-article" sec:authorize="isAuthenticated()" th:href="@{/articles/form}" />

 

detail.th.xml
  <attr sel="#article-buttons" th:if="${#authorization.expression('isAuthenticated()')} and *{userId} == ${#authentication.name}">

 

마찬가지로 댓글쪽에서도 넣기,

 

 

인증 정보의 `userId`와
해당 게시글/댓글의 작성자 `userId`가 동일한지 알려면
응답에서 `userId`를 내려줘야 함
이를 response dto 에 반영

package com.fastcampus.projectboard.dto.response;

import com.fastcampus.projectboard.dto.ArticleCommentDto;

import java.time.LocalDateTime;

public record ArticleCommentResponse(
        Long id,
        String content,
        LocalDateTime createdAt,
        String email,
        String nickname,
        String userId
) {

    public static ArticleCommentResponse of(Long id, String content, LocalDateTime createdAt, String email, String nickname, String userId) {
        return new ArticleCommentResponse(id, content, createdAt, email, nickname, userId);
    }

    public static ArticleCommentResponse from(ArticleCommentDto dto) {
        String nickname = dto.userAccountDto().nickname();
        if (nickname == null || nickname.isBlank()) {
            nickname = dto.userAccountDto().userId();
        }

        return new ArticleCommentResponse(
                dto.id(),
                dto.content(),
                dto.createdAt(),
                dto.userAccountDto().email(),
                nickname,
                dto.userAccountDto().userId()
        );
    }

}

 

Comments