Develop

[Thymeleaf 타임리프] Spring Security를 사용하여 로그인 정보를 Thymeleaf에서 출력하는 방법

issuemaker99 2024. 10. 4. 16:42
728x90

Spring Security를 사용하여 로그인 정보를 Thymeleaf에서 출력하는 방법

 

1. 프로젝트 설정

먼저 Spring Boot 프로젝트를 생성하고, 필요한 의존성을 추가합니다.

build.gradle (또는 pom.xml)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

2. Spring Security 설정

로그인 및 인증 관련 설정을 포함한 SecurityConfig 클래스를 만듭니다.

SecurityConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.stereotype.Controller;

@Controller
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();

        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build());
        return manager;
    }
}

위 설정에서는 InMemoryUserDetailsManager를 사용하여 메모리에 간단한 사용자 데이터를 생성합니다. 실제 애플리케이션에서는 DB나 다른 외부 인증 소스를 사용할 수 있습니다.

3. 로그인 페이지 만들기

사용자 로그인 페이지를 작성합니다. 이 페이지는 /login 경로로 접근할 수 있습니다.

login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
<h2>Login</h2>
<form th:action="@{/login}" method="post">
    <div>
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
    </div>
    <div>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
    </div>
    <div>
        <button type="submit">Login</button>
    </div>
</form>
</body>
</html>

 

4. 로그인 후 사용자 정보 출력

로그인한 사용자의 정보를 Thymeleaf에서 출력하려면, Spring Security의 Principal 객체를 사용하여 사용자 정보를 얻을 수 있습니다.

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Home</title>
</head>
<body>
<h1>Welcome, <span th:text="${#authentication.name}"></span>!</h1>

<p>User roles: <span th:text="${#authentication.authorities}"></span></p>

<!--ROLE_USER 권한을 갖는다면 이 글이 보임-->
<h1 sec:authorize="hasRole('ADMIN')">Has admin Role</h1>

<!--ROLE_ADMIN 권한을 갖는다면 이 글이 보임-->
<h1 sec:authorize="hasRole('USER')">Has user Role</h1> 

<!--어떤 권한이건 상관없이 인증이 되었다면 이 글이 보임-->
<div sec:authorize="isAuthenticated()">
    Only Authenticated user can see this Text
</div>

<!--인증시 사용된 객체에 대한 정보-->
<b>Authenticated DTO:</b>
<div sec:authentication="principal"></div>
<div th:text="${#authentication.principal}"></div>

<!--인증시 사용된 객체의 Username (ID)-->
<b>Authenticated username:</b>
<div sec:authentication="name"></div>
<div th:text="${#authentication.name}"></div>

<!--객체의 권한-->
<b>Authenticated user role:</b>
<div sec:authentication="principal.authorities"></div>
<div th:text="${#authentication.principal.authorities}"></div>

<a th:href="@{/logout}">Logout</a>
</body>
</html>
LIST