메뉴별 권한 설정

thkim
강석 최 2024-04-19 17:42:51 +09:00
parent d3b0cdd749
commit 49a474103a
11 changed files with 180 additions and 103 deletions

View File

@ -177,12 +177,12 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<div className="col">
<h3>사이트관리</h3>
<ul>
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>일정관리</NavLink></li>
<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>대시보드</NavLink></li>
{/*<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}></NavLink></li>
<li><NavLink to={URL.ADMIN_USAGE} className={({ isActive }) => (isActive ? "cur" : "")}>게시판사용관리</NavLink></li>
<li><NavLink to={URL.ADMIN_NOTICE} className={({ isActive }) => (isActive ? "cur" : "")}>공지사항관리</NavLink></li>
<li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>*/}
</ul>
</div>
}
@ -241,8 +241,8 @@ function EgovHeader({ loginUser, onChangeLogin }) {
</div>
{sessionUserSe ==='ACC_TP01' &&
<>
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
<div className="submenu closed">
<h3><Link to={URL.ADMIN_SCHEDULE}>사이트관리</Link></h3>
{/*<div className="submenu closed">
<ul>
<li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>일정관리</NavLink></li>
<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>
@ -251,7 +251,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>
<li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>
</ul>
</div>
</div>*/}
</>
}
</div>

View File

@ -1,11 +1,13 @@
import React from 'react';
import React, {useCallback, useEffect, useState} from 'react';
import { useLocation } from 'react-router-dom';
import { NavLink } from 'react-router-dom';
import URL from 'constants/url';
import {Accordion} from "react-bootstrap";
import * as EgovNet from "../../api/egovFetch";
function EgovLeftNavAdmin(props) {
const location = useLocation();
const [accordion, setAccordion] = useState([]);
const getMiddleFolder = (url) => { //
const parts = url.split('/').filter(Boolean); // '/'
@ -36,106 +38,66 @@ function EgovLeftNavAdmin(props) {
// activeKey = "7";
// }
const getMenuAuth = useCallback(()=>{
EgovNet.requestFetch(
'/leftNav/menu?menuType=MNU_0000',
{
method: "GET"
},
(resp) => {
const temp = [];
resp.result.menuList.forEach(function (group, i) {
temp.push(
<Accordion.Item eventKey={i}>
<Accordion.Header>{group.menuTitle}</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
{group.childList.map((menu) => {
return (
<li><NavLink to={menu.menuUrl} className={({ isActive }) => (isActive ? "cur" : "")}>{menu.menuTitle}</NavLink></li>
)
})}
</ul>
</Accordion.Body>
</Accordion.Item>
)
})
setAccordion(temp)
},
function (resp){
}
);
}, []);
useEffect(()=>{
getMenuAuth();
}, [])
return (
<div className="nav">
<div className="inner">
<h2 className={"nav_title"}>사이트관리
<NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}><h6 className={"nav_subtitle"}>Dashboard</h6></NavLink></h2>
<Accordion defaultActiveKey={activeKey}>
{/*<Accordion.Item eventKey={"7"}>*/}
{/* <Accordion.Header>사이트 관리</Accordion.Header>*/}
{/* <Accordion.Body>*/}
{/* <ul className="menu4">*/}
{/* <li><NavLink to={URL.ADMIN_SCHEDULE} className={({ isActive }) => (isActive ? "cur" : "")}>Dashboard</NavLink></li>*/}
{/* /!*<li><NavLink to={URL.ADMIN_BOARD} className={({ isActive }) => (isActive ? "cur" : "")}>게시판생성관리</NavLink></li>*/}
{/* <li><NavLink to={URL.ADMIN_USAGE} className={({ isActive }) => (isActive ? "cur" : "")}>게시판사용관리</NavLink></li>*/}
{/* <li><NavLink to={URL.ADMIN_NOTICE} className={({ isActive }) => (isActive ? "cur" : "")}>공지사항관리</NavLink></li>*/}
{/* <li><NavLink to={URL.ADMIN_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트갤러리관리</NavLink></li>*/}
{/* <li><NavLink to={URL.ADMIN_MANAGER} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리자 암호변경</NavLink></li>*!/*/}
{/* </ul>*/}
{/* </Accordion.Body>*/}
{/*</Accordion.Item>*/}
<Accordion.Item eventKey={"0"}>
<Accordion.Header>환경설정</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN_BASE_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>기본코드 관리</NavLink></li>
<li><NavLink to={URL.ADMIN_STANDARD_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준코드 관리</NavLink></li>
<li><NavLink to={URL.ADMIN_COMMITTEE_CODE} className={({ isActive }) => (isActive ? "cur" : "")}>위원회코드 관리</NavLink></li>
<li><NavLink to={URL.ADMIN_MENU} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴 관리</NavLink></li>
<li><NavLink to={URL.ADMIN_MENU_AUTH} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴권한 관리</NavLink></li>
<li><NavLink to={URL.ADMIN_ABOUT_SITE} className={({ isActive }) => (isActive ? "cur" : "")}>관련사이트 관리</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"1"}>
<Accordion.Header>사용자 관리</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 목록</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"2"}>
<Accordion.Header>게시판현황</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__BOARDS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>게시판 관리</NavLink></li>
<li><NavLink to={URL.ADMIN__BOARDS__POSTS} className={({ isActive }) => (isActive ? "cur" : "")}>게시물 관리</NavLink></li>
{/*<li><NavLink to={URL.ADMIN__BOARDS__KEYWORDS} className={({ isActive }) => (isActive ? "cur" : "")}>키워드 관리</NavLink></li>*/}
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"3"}>
<Accordion.Header>건설기준관리</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
{/*<li><NavLink to={URL.ADMIN__STANDARDS__REFERENCE_CODES} className={({ isActive }) => (isActive ? "cur" : "")}>참조코드 관리</NavLink></li>*/}
<li><NavLink to={URL.ADMIN__STANDARDS__API_KYES} className={({ isActive }) => (isActive ? "cur" : "")}>API KEY 관리</NavLink></li>
<li><NavLink to={URL.ADMIN__STANDARDS__SIMILARITY_CHECK} className={({ isActive }) => (isActive ? "cur" : "")}>유사성 검사</NavLink></li>
<li><NavLink to={URL.ADMIN__STANDARDS__INFO_DISCLOSURE} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준 내용 관리</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"4"}>
<Accordion.Header>컨텐츠관리</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__CONTENTS__SURVEY} className={({ isActive }) => (isActive ? "cur" : "")}>설문 관리</NavLink></li>
<li><NavLink to={URL.ADMIN__CONTENTS__POP_UP} className={({ isActive }) => (isActive ? "cur" : "")}>팝업 관리</NavLink></li>
<li><NavLink to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH} className={({ isActive }) => (isActive ? "cur" : "")}>건설기준연구 관리</NavLink></li>
{/*<li><NavLink to={URL.ADMIN__CONTENTS__TEXT_MESSAGES} className={({ isActive }) => (isActive ? "cur" : "")}>문자 발송</NavLink></li>*/}
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"5"}>
<Accordion.Header>위원회관리</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className={({ isActive }) => (isActive ? "cur" : "")}>진행현황 관리</NavLink></li>
<li><NavLink to={URL.ADMIN__COMMITTEE__SCHEDULES} className={({ isActive }) => (isActive ? "cur" : "")}>위원회 일정 관리</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>
<Accordion.Item eventKey={"6"}>
<Accordion.Header>로그현황</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__LOGS__MENU_ACCESS_INFO} className={({ isActive }) => (isActive ? "cur" : "")}>메뉴별 접속 현황</NavLink></li>
<li><NavLink to={URL.ADMIN__LOGS__USER_CONNECTIONS} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 접속 현황</NavLink></li>
<li><NavLink to={URL.ADMIN__LOGS__PRIVACY_LOGS} className={({ isActive }) => (isActive ? "cur" : "")}>개인정보 로그 현황</NavLink></li>
<li><NavLink to={URL.ADMIN__LOGS__FILE_DOWNLOAD_STATUS} className={({ isActive }) => (isActive ? "cur" : "")}>파일 다운 현황</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>
{accordion}
{/*{menuList.map((group, i) => {
return (
<Accordion.Item eventKey={i}>
<Accordion.Header>{group.menuTitle}</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
{group.childList.map((menu) => {
return (
<li><NavLink to={menu.menuUrl} className={({ isActive }) => (isActive ? "cur" : "")}>{menu.menuTitle}</NavLink></li>
)
})}
</ul>
</Accordion.Body>
</Accordion.Item>
)
})}*/}
</Accordion>
</div>
</div>
);

View File

@ -39,7 +39,10 @@ function MenuAuthMgt(props) {
if(checked) {
item.menuAuth += ","+role.itemCd
}else{
item.menuAuth = item.menuAuth.replace(","+role.itemCd, '');
item.menuAuth = item.menuAuth.replace(role.itemCd, '');
if(item.menuAuth.startsWith(",")) {
item.menuAuth.replace(",", "")
}
}
}}
defaultChecked={item.menuAuth.includes(role.itemCd)}/>

View File

@ -10,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@ -53,9 +54,18 @@ public class TcMenu {
@Column(name = "use_yn")
private String useYn;
@Transient
private String groupTitle;
@Transient
private String menuTypeValue;
@Transient
private String menuAuth;
@Transient
private List<String> roleList;
@Transient
private List<TcMenu> childList;
}

View File

@ -11,4 +11,6 @@ public interface TcMenuMapper {
List<TcMenu> selectMenuList();
List<TcMenu> selectMenuAuthList();
List<TcMenu> selectMenuListToRole(TcMenu params);
}

View File

@ -162,6 +162,14 @@ public class AdminConfigService extends EgovAbstractServiceImpl {
return menuMapper.selectMenuAuthList();
}
public List<TcMenu> selectMenuListToRole(String menuTypeCd, List<String> roleList){
TcMenu params = new TcMenu();
params.setMenuTypeCd(menuTypeCd);
params.setRoleList(roleList);
return menuMapper.selectMenuListToRole(params);
}
@Transactional
public void editMenuAuth(TcMenu menu) {
String[] roleAry = menu.getMenuAuth().split(",");

View File

@ -0,0 +1,59 @@
package com.dbnt.kcscbackend.admin.leftNav;
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
import com.dbnt.kcscbackend.admin.config.service.AdminConfigService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequiredArgsConstructor
@RequestMapping("/leftNav")
@Tag(name="LeftNavController", description = "leftNav 컨트롤러")
public class LeftNavController {
private final AdminConfigService adminConfigService;
@RequestMapping(method = RequestMethod.GET, value = "/menu")
public ResultVO getMenu(
@AuthenticationPrincipal LoginVO user,
@RequestParam(value="menuType", required = true) String menuTypeCd
){
ResultVO resultVO = new ResultVO();
List<TcMenu> menuList = adminConfigService.selectMenuListToRole(menuTypeCd, Arrays.asList(user.getUserRole().split(",")));
Map<String, String> groupMap = new LinkedHashMap<>();
for(TcMenu menu: menuList){
groupMap.put(menu.getMenuGroup(), menu.getGroupTitle());
}
List<TcMenu> groupList = new ArrayList<>();
for(Map.Entry<String, String> group: groupMap.entrySet()){
TcMenu temp = new TcMenu();
temp.setMenuId(group.getKey());
temp.setMenuTitle(group.getValue());
groupList.add(temp);
}
for(TcMenu group: groupList){
for(TcMenu menu: menuList){
if(group.getMenuId().equals(menu.getMenuGroup())){
if(group.getChildList()==null){
group.setChildList(new ArrayList<>());
}
group.getChildList().add(menu);
}
}
}
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("menuList", groupList);
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -61,6 +61,9 @@ public class LoginVO implements Serializable{
@Schema(description = "사용자 구분", allowableValues = {"ACC_TP01", "ACC_TP02"}, defaultValue = "ACC_TP02")
private String userSe;
@Schema(description = "사용자 ROLE")
private String userRole;
@Schema(description = "이름")
@NotBlank(message = "이름을 입력해주세요.")
private String userNm;

View File

@ -70,6 +70,10 @@ public class EgovJwtTokenUtil implements Serializable{
Claims claims = getClaimFromToken(token);
return claims.get("userSe").toString();
}
public String getUserRoleFromToken(String token) {
Claims claims = getClaimFromToken(token);
return claims.get("userRole").toString();
}
public String getInfoFromToken(String type, String token) {
Claims claims = getClaimFromToken(token);
return claims.get(type).toString();
@ -96,7 +100,8 @@ public class EgovJwtTokenUtil implements Serializable{
claims.put("userSeq", loginVO.getUserSeq());
claims.put("id", loginVO.getUserId());
claims.put("remoteAddr", remoteAddr);
claims.put("userSe", loginVO.getUserSe() );
claims.put("userSe", loginVO.getUserSe());
claims.put("userRole", loginVO.getUserRole());
claims.put("type", "Authorization");
log.debug("===>>> secret = "+SECRET_KEY);

View File

@ -69,7 +69,8 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
logger.debug("jwtToken validated");
loginVO.setUserSeq(Integer.parseInt(jwtTokenUtil.getUserSeqFromToken(jwtToken)));
loginVO.setId(id);
loginVO.setUserSe( jwtTokenUtil.getUserSeFromToken(jwtToken) );
loginVO.setUserSe(jwtTokenUtil.getUserSeFromToken(jwtToken));
loginVO.setUserRole(jwtTokenUtil.getUserRoleFromToken(jwtToken));
// loginVO.setUniqId( jwtTokenUtil.getInfoFromToken("uniqId",jwtToken) );
// loginVO.setOrgnztId( jwtTokenUtil.getInfoFromToken("orgnztId",jwtToken) );
// loginVO.setName( jwtTokenUtil.getInfoFromToken("name",jwtToken) );

View File

@ -28,6 +28,7 @@
select a.menu_id ,
a.menu_title ,
a.menu_group ,
a.menu_url,
coalesce(b.role_cd, '') as menu_auth
from tc_menu a
left outer join (
@ -38,4 +39,27 @@
where a.use_yn = 'Y'
order by a.menu_id asc
</select>
<select id="selectMenuListToRole" resultType="TcMenu" parameterType="TcMenu">
select a.menu_id ,
a.menu_title ,
a.menu_group ,
a.menu_url,
c.menu_title as group_title,
coalesce(b.role_cd, '') as menu_auth
from tc_menu a
inner join (
select menu_id , string_agg(role_id, ',') as role_cd
from tb_menu_role
where role_id in
<foreach collection="roleList" item="role" separator="," open="(" close=")">
#{role}
</foreach>
group by menu_id
) b on a.menu_id = b.menu_id
inner join tc_menu c on a.menu_group = c.menu_id
where a.use_yn = 'Y'
and a.menu_type_cd = #{menuTypeCd}
order by a.menu_id asc
</select>
</mapper>