관리자 메뉴 중 권한이 없는 메뉴는 숨기기
본문
관리자가 특정회원들(여러명)에게 특정 페이지(페이지 1개)에 권한을 준 상태입니다.
특정회원들이 관리자페이지로 접속시 접근권한이 있는 페이지만 보이게 하고 싶습니다.
권한이 부여된 페이지만 노출을 하고 싶습니다.
이런식으로 권한이 없는 페이지들은 아예 숨겨버리고 싶습니다.
권한이 부여된 페이지만, 즉, 왼쪽에 아이콘도 회원관리 아이콘만 떠있게하고, 권한을 가진 특정회원들이 관리자페이지로 접속시 해당 페이지로 이동이 되게 하고 싶습니다ㅠ
결과적으로는 권한을 가진 회원이 관리자페이지 접속시 이렇게 됐으면 합니다.
관리권한 메뉴 검색을 해봤는데 원하는 정보를 얻지못해 질문드립니다.
<ul class="gnb_ul">
<?php
$jj = 1;
foreach($amenu as $key=>$value) {
$href1 = $href2 = '';
if (isset($menu['menu'.$key][0][2]) && $menu['menu'.$key][0][2]) {
$href1 = '<a href="'.$menu['menu'.$key][0][2].'" class="gnb_1da">';
$href2 = '</a>';
} else {
continue;
}
$current_class = "";
if (isset($sub_menu) && (substr($sub_menu, 0, 3) == substr($menu['menu'.$key][0][0], 0, 3)))
$current_class = " on";
$button_title = $menu['menu'.$key][0][1];
?>
<li class="gnb_li<?php echo $current_class;?>">
<button type="button" class="btn_op menu-<?php echo $key; ?> menu-order-<?php echo $jj; ?>" title="<?php echo $button_title; ?>"><?php echo $button_title;?></button>
<div class="gnb_oparea_wr">
<div class="gnb_oparea">
<h3><?php echo $menu['menu'.$key][0][1];?></h3>
<?php echo print_menu1('menu'.$key, 1); ?>
</div>
</div>
</li>
<?php
$jj++;
} //end foreach
?>
</ul>
admin.head.php 의 메뉴 출력하는 부분에서 건드리면 될 것 같은데... $member['mb_id'] 로 g5_auth 테이블을 조회해서 권한이 있는 메뉴의 타이틀을 가져와서 비교해서 출력해야하는지... 관리자쪽은 개발을 건드려보질 않아서 감이 안오네요..;;ㅠ
!-->답변 2
권한없는 아이콘은 adm/css/admin.css 제일 아래에 아래코드 추가하시고
.gnb_li:not(:has(a.gnb_2da)){display:none}
adm/index.php 파일 require_once './_common.php'; 바로아래에 아래코드 추가하시면 권한있는 페이지중 첫번쨰걸로 이동됩니다
if ($is_admin != 'super') {
$targetKey = key($auth);
$mem_auth_menu = $menu['menu' . substr($targetKey, 0, 3)];
$targetValue = '';
foreach ($mem_auth_menu as $item) {
if ($item[0] == $targetKey) {
$targetValue = $item[2];
break;
}
}
if ($targetValue) {
goto_url($targetValue);
}
}
!-->!-->
g5_auth 테이블에서 해당 회원의 권한을 확인하고,
admin.head.php 파일의 메뉴 출력 로직을 수정하여
권한에 따라 메뉴를 필터링해야 한다는 판단입니다.
*$member['mb_id']를 사용하여 g5_auth 테이블에서 해당 회원의 권한 목록을 조회
*$menu 배열에서 각 메뉴 항목을 순회하면서
권한 정보와 비교하여 회원이 접근 가능한 메뉴만 출력
*adm/admin.head.php의 수정된 예제 (최신 그누 순정 구조 참고함)
<ul class="gnb_ul">
<?php
$jj = 1;
// 현재 회원의 권한을 가져옵니다.
$auth_query = "SELECT auth_code FROM g5_auth WHERE mb_id = '{$member['mb_id']}'";
$auth_result = sql_query($auth_query);
$auth_codes = [];
while ($row = sql_fetch_array($auth_result)) {
$auth_codes[] = $row['auth_code'];
}
foreach ($amenu as $key => $value) {
$menu_auth_code = $menu['menu'.$key][0][3]; // 메뉴별 권한 코드 (예: 'menu_auth_code')
// 회원이 메뉴에 접근 권한이 있는지 확인
if (!in_array($menu_auth_code, $auth_codes)) {
continue; // 권한이 없으면 출력하지 않음
}
$href1 = $href2 = '';
if (isset($menu['menu'.$key][0][2]) && $menu['menu'.$key][0][2]) {
$href1 = '<a href="'.$menu['menu'.$key][0][2].'" class="gnb_1da">';
$href2 = '</a>';
}
$current_class = "";
if (isset($sub_menu) && (substr($sub_menu, 0, 3) == substr($menu['menu'.$key][0][0], 0, 3))) {
$current_class = " on";
}
$button_title = $menu['menu'.$key][0][1];
?>
<li class="gnb_li<?php echo $current_class;?>">
<?php echo $href1; ?>
<button type="button" class="btn_op menu-<?php echo $key; ?> menu-order-<?php echo $jj; ?>" title="<?php echo $button_title; ?>">
<?php echo $button_title;?>
</button>
<?php echo $href2; ?>
</li>
<?php
$jj++;
} // end foreach
?>
</ul>
- auth_query: 현재 회원의 권한 코드 목록을 데이터베이스에서 가져옴.
- in_array(): 메뉴별 권한 코드와 회원의 권한 코드 목록을 비교하여 접근 가능 여부를 확인.
- 권한이 없는 메뉴는 출력하지 않도록 continue를 사용함.
위 코드를 통해 특정 회원의 권한에 따라 관리자 메뉴가 필터링되어 표시되며,
권한이 없는 메뉴는 아예 숨겨집니다.
★ 추가로 개선이 요구되는 부분 ★
*SQL 인젝션을 방지하기 위해
$member['mb_id'] 값에 대해 필터링 또는 prepare 방식의 쿼리 사용이 권장됨.
*권한 확인이 자주 발생하는 경우,
조회된 권한 목록을 세션에 저장하여 쿼리를 최소화하는 방법을 고려해 볼 수 있음.
*메뉴가 보이지 않는 대신,
"접근 권한 없음"과 같은 사용자 피드백 메시지를 추가하면 '사용자 경험'에 도움이 됨.
!-->