티스토리 뷰

반응형

로그인 여부 & 권한 여부 확인하기

로그인 하지 않은 사용자에게 '로그인' 메뉴가 노출되지만, 로그인 한 사용자에게는 '로그인' 메뉴가 사라지고, 혹은 관리자 권한을 가진 유저에게만 관리자페이지로 가는 메뉴를 노출해야 하는 일은 프론트 구현 과정에서 필수적인 과정이다. 기존에는 세션을 이용하여서 직접 유저의 권한과 로그인 여부를 확인했었지만 스프링 시큐리티를 적용했기 때문에 이런 과정도 스프링 시큐리티를 이용하여서 진행해야 했다.

1. MAVEN 의존성 설정

기존에 타임리프를 사용하기 위한 의존성 이외에 추가적으로 아래와 같은 의존성을 설정해야 한다.

<dependency>
	<groupId>org.thymeleaf.extras</groupId>
	<artifactId>thymeleaf-extras-springsecurity5</artifactId>
	<version>3.0.4.RELEASE</version>
</dependency>

2. SpringSecurityDialect 설정하기

설정 파일에 SpringSecurityDialect 빈 등록을 위한 설정을 추가한다. 시큐리티와 관련이 있어서 WebSecurityConfigurerAdapter을 상속받은 SecurityConfig에다가 넣었다. 빈으로만 등록 하면 되니 반드시 WebSecurityConfigurerAdapter에서 설정하지 않아도 된다. 다른 문서를 보니 SpringSecurityDialect 메소드 내부에 여러가지 설정을 했는데, 스프링 부트에서 기본적인 설정이 되어 있는건지 바로 반환만 시켜주어도 사용 가능했다.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    . . .

    @Bean
    public SpringSecurityDialect springSecurityDialect(){
        return new SpringSecurityDialect();
    }

    . . .
}

3. thymeleaf에서 사용하기

2번과 같은 설정을 해둔다면 굳이 네임스페이스를 설정하지 않아도 되지만 sec라는 네임스페이스를 굳이 등록하고 싶다면 xmlns:sec="http://www.thymeleaf.org/extras/spring-security" 를 html 태그 내부에 넣으면 된다.

//ROLE_ADMIN 권한이 있는 경우만 표시됨
<li sec:authorize="hasRole('ROLE_ADMIN')"><a th:href="@{/admin}">관리자 페이지</a></li>
//ROLE_USER 권한이 있는 경우만 표시됨
<li sec:authorize="hasRole('ROLE_USER')"><a th:href="@{/books}">책 목록</a></li>
//로그인이 되지 않은 경우 표시
<li sec:authorize="!isAuthenticated()"><a th:href="@{/users}">회원가입</a></li>
//로그인 된 경우의 username을 출력
<li sec:authorize="isAuthenticated()"><span sec:authentication="principal.username"></span></li>
//변수처럼 사용하고 싶은 경우
<a th:href="@{'/users/'+ ${#authentication.principal.id}}">마이페이지</a>


반응형
댓글