관리자가 특정회원들(여러명)에게 특정 페이지(페이지 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개 / 댓글 3개
권한없는 아이콘은 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);
}
}
답변에 대한 댓글 1개
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 방식의 쿼리 사용이 권장됨.
*권한 확인이 자주 발생하는 경우,
조회된 권한 목록을 세션에 저장하여 쿼리를 최소화하는 방법을 고려해 볼 수 있음.
*메뉴가 보이지 않는 대신,
"접근 권한 없음"과 같은 사용자 피드백 메시지를 추가하면 '사용자 경험'에 도움이 됨.
답변에 대한 댓글 2개
답변주신 내용을 토대로 auth_code 를 가져오시길래 해당 값이 어떻게 들어가있는지, 왜 auth_code 를 가져오는건지 이해하려고 db를 확인하던 찰나 답변 중 필드가 잘못되어있네요...
auth_table 에는 mb_id, au_menu, au_auth 필드 이렇게 3개가 있네요...
우선 알려주신 방법에서 auth_code 를 au_menu 로 바꿔보는 작업을 먼저 해보고,
안될 경우 au_menu 에 들어간 메뉴코드(?) 값과 출력해야할 코드값을 대조해서 일치하면 출력하는 방법으로 해봐야겠어요!
메뉴 코드와 au_menu의 값을 비교하여 메뉴를 필터링하는 방식으로 충분히 구현할 수 있을 듯합니다.
답변을 작성하려면 로그인이 필요합니다.
와... 왜 not has 로 처리할 생각을 못했을까요...?! 머리속에 개발로 풀어야하나 라는 생각에 갇혀있었네요...!!
알려주신 방법으로 한방에 해결됐네요ㅠㅠㅠ
index 에 super 가 아닌 경우의 조건이 걸린 코드는 이해하려면 한번 분석해봐야겠어요!!
답변 감사드립니다ㅠ