ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0922. 게시글 버튼 수정(권한에 따라 숨기기)
    카테고리 없음 2023. 9. 23. 11:07

    상세보기에서 로그인을 안 해도 수정이나 삭제 버튼이 보이는 문제를 수정해야 한다.

     

     

     

    get.jsp

    => menu.jsp 에서 principal을 username으로 저장해 놓았기 때문에 get.jsp에서 if로 쓸 수 있는 것이다.

     

     

    modify에서 수정기능도 고치기

    modify.jsp 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
    <%@include file="../layouts/header.jsp"%>
    
    <link rel="stylesheet" href="/resources/css/summernote/summernote-lite.min.css">
    <script src="/resources/js/summernote/summernote-lite.min.js"></script> 
    <script src="/resources/js/summernote/lang/summernote-ko-KR.min.js"></script> 
    
    <script>
    $(document).ready(function() {
    	$('#content').summernote({
    		height: 300,                 // 에디터 높이
    		lang: "ko-KR",					// 한글 설정
    	});
    /* 
    	$('.get').click(function(){
    		document.forms.getForm.submit();
    	});	 
    */
    
    });
    </script>
    
    <h1 class="page-header"><i class="far fa-edit"></i> 글 수정</h1>
    
    <div class="panel panel-default">
    	<div class="panel-body">
    		<form:form modelAttribute="board" role="form">
    		<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token }" />
    			<form:hidden path="bno"/>
    			<form:hidden path="writer"/> <!-- board의 writer항목으로만 쓰고 수정 못 하게 -->
    			
    			<div class="form-group">
    				<form:label path="title">제목</form:label>
    				<form:input path="title" cssClass="form-control" />
    				<form:errors path="title" cssClass="error"/>
    			</div>			
    			
    			<div class="form-group">
    				<form:label path="content">내용</form:label>
    				<form:textarea path="content" class="form-control"></form:textarea>
    				<form:errors path="content" cssClass="error"/>
    			</div>
    
    			<button type="submit" class="btn btn-primary">
                 <i class="fas fa-check"></i> 확인</button>
    			<button type="reset" class="btn btn-primary">
                 <i class="fas fa-undo"></i> 취소</button>
    			<a href="${cri.getLinkWithBno('get', board.bno)}" class="btn btn-primary get">
                 <i class="fas fa-file-alt"></i> 돌아가기</a>
    		</form:form>
    	</div>
    </div>
    
    <%@include file="../layouts/footer.jsp"%>

     

    +) post 전송했는데 한글 안 깨지는 이유

    package org.galapagos.config;
    
    import javax.sql.DataSource;
    
    import org.galapagos.security.CustomUserDetailsService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
    import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
    import org.springframework.security.web.csrf.CsrfFilter;
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    
    import lombok.extern.log4j.Log4j;
    
    
    @Configuration
    @EnableWebSecurity
    @EnableWebMvc
    @Log4j
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    	
    	@Bean
    	public PasswordEncoder passwordEncoder() {
    		return new BCryptPasswordEncoder();
    	}
    		
    	protected void configure(HttpSecurity http) throws Exception {
    		
    		//csrf가 동작하기 전에 필터가 동작해서 한글이 깨지지 않는다.
    		CharacterEncodingFilter filter = new CharacterEncodingFilter();
    		filter.setEncoding("UTF-8");
    		filter.setForceEncoding(true);
    		http.addFilterBefore(filter, CsrfFilter.class);

     


    travel

    글 수정 삭제를 admin과 manager만 가능하게 하기

    그리고 이번 경우는 권한이 없으면 아예 버튼이 안 보이게 해야 한다.

     

    SecurityConfig 

    .antMatchers(
    				"/travel/register",
    				"/travel/modify",
    				"/travel/remove").access("hasRole('ROLE_MANAGER')");
    		//manager선에서 부여하면 윗선 admin도 같이 권한 생김

     

    참고

     

    travel의 list.jsp 에서 맨 위에 sec taglib 태그 추가하고

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

    <sec:authorize access> 코드 추가 div 태그 감싸주기 

    <!-- manager 이상 권한만 추가버튼 보이게 하기 -->
    <sec:authorize access="hasRole('ROLE_MANAGER')">
    	<div class="text-right">
    		<a href="register" class="btn btn-primary"> <i class="far fa-edit"></i>
    			추가
    		</a>
    	</div>
    </sec:authorize>

     

    똑같은 작업을 상세보기에서도 해야 한다. 

    get.jsp

    <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec"%>
    	<sec:authorize access="hasRole('ROLE_MANAGER')">
    		<a href="${cri.getLink('modify')}&no=${travel.no}" class="btn btn-primary modify">
    			<i class="far fa-edit"></i> 수정</a>
    		<a href="#" class="btn btn-danger remove">
    			<i class="fas fa-trash-alt"></i> 삭제</a>
    	</sec:authorize>

     

     

    그 후 csrf 토큰을 modify, get, register jsp에 추가해줘야한다. 그래야 일반유저한테 버튼 안 보인다.

    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token }" />

     

    목록에서 "추가" or "글쓰기" 버튼 숨기기

     

    상세보기에서 삭제버튼 숨기기
    상세보기에서 수정 버튼 숨기기

     

     

     

Designed by Tistory.