๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Spring Security๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ฉด, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ทฐ(Thymeleaf)์™€

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์™€์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” 3๊ฐ€์ง€ ํŒจํ„ด์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


1. ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๋ฉ”๋‰ด ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ

Thymeleaf์—์„œ thymeleaf-extras-springsecurity6 ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด,

sec:authorize ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ…œํ”Œ๋ฆฟ ์ƒ๋‹จ์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค:

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

 

๊ทธ ๋‹ค์Œ ์›ํ•˜๋Š” ์˜์—ญ์— ์กฐ๊ฑด์„ ๊ฑธ๋ฉด ๋œ๋‹ค :

<!-- ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋งŒ '๋“ฑ๋ก' ๋ฒ„ํŠผ ๋ณด์ด๊ธฐ -->
<div sec:authorize="isAuthenticated()">
    <a href="/board/register">
        <button type="button">๋“ฑ๋ก</button>
    </a>
</div>

 

isAuthenticated() ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋งŒ
isAnonymous() ๋กœ๊ทธ์ธ ์•ˆํ•œ ์‚ฌ์šฉ์ž๋งŒ
hasRole('ADMIN') ํŠน์ • ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ

 


2. ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ธฐ

Spring Security๊ฐ€ ์ œ๊ณตํ•˜๋Š” #authentication ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด

ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ username(id)์„ ๋ฐ”๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

<!-- ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž id ํ‘œ์‹œ -->
<span th:text="${#authentication.name}"></span>

<!-- ํผ์— ์ž๋™ ์ž…๋ ฅ -->
<input type="text" name="id" th:value="${#authentication.name}" readonly>

์—ฌ๊ธฐ์„œ #authentication.name์€ Principal.getName()๊ณผ ๋™์ผํ•˜๋‹ค.

์ฆ‰, ๋กœ๊ทธ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์•„์ด๋””(id)๊ฐ€ ๋“ค์–ด์˜จ๋‹ค.


3. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž ํ™œ์šฉํ•˜๊ธฐ

๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—์„œ๋„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์‹œ, ์ž‘์„ฑ์ž๋ฅผ ๋ฌด์กฐ๊ฑด ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž id๋กœ ์ €์žฅํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค:

@PostMapping("/register")
public String registerPost(BoardDTO dto,
                           Principal principal) {

    // ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž id๋ฅผ ์ž‘์„ฑ์ž์— ๊ฐ•์ œ ์„ธํŒ…
    dto.setId(principal.getName());

    boardService.register(dto);

    return "redirect:/board/list";
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”๋ฉด์—์„œ ์กฐ์ž‘ํ•˜๋”๋ผ๋„ ์ž‘์„ฑ์ž ํ•„๋“œ๋Š” ํ•ญ์ƒ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž id๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๋œ๋‹ค.

 


4. ์ž‘์„ฑ์ž ๋ณธ์ธ๋งŒ ๋งํฌ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์—์„œ ๊ธ€ ๋ฒˆํ˜ธ๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ, ์ž‘์„ฑ์ž ๋ณธ์ธ์—๊ฒŒ๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด :

<th>
    <!-- ๋ณธ์ธ์ผ ๋•Œ๋งŒ ๋งํฌ -->
    <a th:if="${dto.id == #authentication.name}"
       th:href="@{/board/read(no=${dto.no}, page=${list.number +1})}">
        [[${dto.no}]]
    </a>

    <!-- ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ผ ๊ฒฝ์šฐ ๋‹จ์ˆœ ์ถœ๋ ฅ -->
    <span th:if="${dto.id != #authentication.name}">
        [[${dto.no}]]
    </span>
</th>

 


์ •๋ฆฌ

sec:authorize๋กœ ๋ฉ”๋‰ด/๋ฒ„ํŠผ ํ‘œ์‹œ ์กฐ๊ฑด ์ œ์–ด

#authentication.name์œผ๋กœ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž id ์ถœ๋ ฅ

์ปจํŠธ๋กค๋Ÿฌ์—์„œ Principal ์ฃผ์ž…๋ฐ›์•„ dto์— id ์„ธํŒ…

th:if ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ณธ์ธ/๊ถŒํ•œ ์—ฌ๋ถ€์— ๋”ฐ๋ผ UI ์ œ์–ด

 

๐Ÿ‘‰ ์ด๋Ÿฐ ํŒจํ„ด์„ ์ตํ˜€๋‘๋ฉด “๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋งŒ ๊ธฐ๋Šฅ ํ—ˆ์šฉ” ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•