spring-boot 인증 권한, 접근 권한에 따른 비교 연산

오세훈·2023년 11월 7일
0

spring-boot

목록 보기
1/7

AuthProvider.java

package com.chunjae.test06.conf;

import com.chunjae.test06.biz.UserService;
import com.chunjae.test06.entity.Euser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
//인증 관리자
@Component
public class AuthProvider implements AuthenticationProvider {

    @Autowired
    private UserService userService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String name = (String) authentication.getPrincipal(); // 로그인 창에 입력한 name(아이디)
        String password = (String) authentication.getCredentials(); // 로그인 창에 입력한 password

        PasswordEncoder passwordEncoder = userService.passwordEncoder();
        UsernamePasswordAuthenticationToken token;
        Euser userVo = userService.getByName(name);

        if (userVo != null && passwordEncoder.matches(password, userVo.getPassword())) { // 일치하는 user 정보가 있는지 확인
            List<GrantedAuthority> roles = new ArrayList<>();
            if(userVo.getLev().equals("ADMIN")){ // 관리자인 경우
                roles.add(new SimpleGrantedAuthority("ADMIN")); // 관리자 권한 부여
            } else if(userVo.getLev().equals("EMP")){ // 직원인 경우
                roles.add(new SimpleGrantedAuthority("EMP")); // 직원 권한 부여
            } else {
                roles.add(new SimpleGrantedAuthority("USER")); // 유저 권한 부여
            }
            token = new UsernamePasswordAuthenticationToken(userVo.getName(), null, roles);
            // 인증된 user 정보를 담아 SecurityContextHolder에 저장되는 token
            return token;
        }

        throw new BadCredentialsException("No such user or wrong password.");
        // Exception을 던지지 않고 다른 값을 반환하면 authenticate() 메서드는 정상적으로 실행된 것이므로 인증되지 않았다면 Exception을 throw 해야 한다.
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return true;
    }
}

example.jsp

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<c:set var="path1" value="${pageContext.request.contextPath}" />
<sec:authorize access="isAuthenticated()">
    <sec:authentication property="principal" var="principal"/> <%-- 아이디 가져오기 --%>
    <sec:authentication property="authorities" var="authorities"/> <%-- 인증권한 정보 가져오기 --%>
</sec:authorize>

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a class="nav-link" href="${path1}/">Home</a>
            </li>
            <li class="nav-item">
                <a href="${path1}/common/boardList" class="nav-link">게시판</a>
            </li>

            <%-- 로그인 하지 않은 경우 --%>
            <c:if test="${empty principal}">
                <li class="nav-item">
                    <a href="${path1}/common/join" class="nav-link">회원가입</a>
                </li>
                <li class="nav-item">
                    <a href="${path1}/common/login" class="nav-link">로그인</a>
                </li>
            </c:if>

            <%-- 로그인을 한 경우 --%>
            <c:if test="${not empty principal}">
                <li class="nav-item active">아이디: ${principal}</li>
                <li class="nav-item active">직급: ${authorities}</li>
                <li class="nav-item">
                    <a href="${path1}/user/updateForm?name=${principal}" class="nav-link">수정하기</a>
                </li>
                <li class="nav-item">
                    <form action="${path1}/logout" method="post">
                        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
                        <button type="submit" class="nav-link">로그아웃</button>
                    </form>
                </li>
                <li class="nav-item">
                    <a href="${path1}/user/withdraw?id=${principal}" class="nav-link">탈퇴하기</a>
                </li>
            </c:if>

            <%-- admin인 경우에 보여지도록 설정, jstl el --%>
            <c:if test="${authorities eq '[ADMIN]'}">
                <li class="nav-item"><a href="${path1}/admin/admIndex" class="nav-link">관리자 페이지</a></li>
            </c:if>
            <%-- admin인 경우에 보여지도록 설정, spring el --%>
            <%--        <sec:authorize access="hasAuthority('ADMIN')">--%>
            <%--            <li class="nav-item"><a href="${path1}/admin/admIndex" class="nav-link">관리자 페이지</a></li>--%>
            <%--        </sec:authorize>--%>

            <%-- emp인 경우에 보여지도록 설정, jstl el --%>
            <c:if test="${authorities eq '[EMP]'}">
                <li class="nav-item"><a href="${path1}/emp/empIndex" class="nav-link">직원 페이지</a></li>
            </c:if>
            <%-- emp인 경우에 보여지도록 설정  spring el--%>
            <%--        <sec:authorize access="hasAuthority('EMP')">--%>
            <%--            <li class="nav-item"><a href="${path1}/emp/empIndex" class="nav-link">직원 페이지</a></li>--%>
            <%--        </sec:authorize>--%>

            <%-- user인 경우에 보여지도록 설정, jstl el --%>
            <c:if test="${authorities eq '[USER]'}">
                <li class="nav-item"><a href="${path1}/user/userIndex" class="nav-link">마이 페이지</a></li>
            </c:if>
            <%-- emp인 경우에 보여지도록 설정  spring el--%>
            <%--        <sec:authorize access="hasAuthority('EMP')">--%>
            <%--            <li class="nav-item"><a href="${path1}/emp/empIndex" class="nav-link">직원 페이지</a></li>--%>
            <%--        </sec:authorize>--%>
        </ul>
    </div>
</nav>
profile
자바 풀 스택 주니어 개발자

0개의 댓글