Java/Spring

spring security & DB 연계

amungstudy 2023. 8. 28. 11:27

참고 : mvc_security_template

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

join.jsp에서 multipart/form-data라서 multipartResolver가 변환해줌 filter-resolver-servlet순서인데
security filter가 먼저 확인해서 token 없구나 라고 인식해버린다. -> filter 추가 등록 필요


    <!-- multipart-formdata Filter -->
    <filter>
        <filter-name>springMultipartFilter</filter-name>
        <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
    </filter>    
    <filter-mapping>
        <filter-name>springMultipartFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

filterMultipartResolver
라고 root-context.xml에서 resolver 이름 변경(이름은 고정임)

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${security-version}</version>
        </dependency>

C:\Users\admin.m2\repository\org\springframework\security\spring-security-taglibs
jsp페이지에서 해석될 때 태그 라이브러리 가져오기 때문에
프로젝트 lib 폴더에 등록시켜줘야함

header.jsp 에

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

이렇게 등록시켜줌.

아래와 같이 코드 작성

    <!-- 인가된 사용자 -->
                    <sec:authorize access="isAuthenticated()">
                    <!-- sec:authentication : 인가된 사용자 정보 auth / auth.getPrincipal.getMember 를 member라는 변수라고 지정 ==validationMemberVO -->
                        <sec:authentication var="member" property="principal.member"/>
                        <li>
                            <a href="#">
                                <c:choose>
                                    <c:when test="${!empty member.u_profile}">
                                        <img class="profile_img" src="${path}/upload${member.u_profile}"/>
                                    </c:when>
                                    <c:otherwise>
                                        <img class="profile_img" src="${path}/resources/img/profile.jpg"/>
                                    </c:otherwise>
                                </c:choose>
                                ${member.u_name}
                            </a>
                        </li>
                        <li>
                            <a href="${path}/user/logout">로그아웃</a>
                        </li>
                        <li>
                            <a href="${path}/chat">쳇</a>
                        </li>
                    </sec:authorize>

sec:authorize : 권한에 따라서 태그를 보여준다.

AJAX, form 태그 등 무조건 POST 방식이면 CSRF.TOKEN 전달 해야 함!

validate : jQuery에서 만든 라이브러리

<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.19.5/dist/jquery.validate.js"></script>
/* validate : jQuery에서 만든 라이브러리
        submit 되기 전 검증*/

    $("#joinForm").validate({
        // 포커스 out시 유효성 검사
        onfocusout: function(element) {
            this.element(element);
        },
        rules : {
            u_id : {
                required : true,
                email : true,
                // ajax로 검증
                remote : {
                    type : "POST",
                    url : "${path}/user/uidCheck"

                    /*,
                    data : {
                        '${_csrf.parameterName}':'${_csrf.token}'
                    }
                    */
                }
            },

$("#form태그아이디값").validate : submit버튼 눌리면 submit 전 검증한다.

messages : {
            u_id : {
                required : "이메일(아이디)를 작성해주세요.",
                email : "올바른 이메일 형식이 아닙니다.",
                remote : "이미 존재하는 ID입니다." //false인 경우
            },

메세지 출력 지정부

spring security에서는 파라미터에서 csrf토큰 있는지 , 요청 헤더에 csrf토큰 있는지 확인함
ajax 요청 보낼게 많은 경우 공통적으로 전달 한다고 해주면 일일이 csrf토큰 자동 전달하게 만들어줌

// 모든 ajax 통신에 csrf 토큰 전달.
    $(document).ajaxSend(function(e,xhr,options){
        xhr.setRequestHeader(
                '${_csrf.headerName}',
                '${_csrf.token}');
    });