관리자 메뉴 중 권한이 없는 메뉴는 숨기기

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
관리자 메뉴 중 권한이 없는 메뉴는 숨기기

QA

관리자 메뉴 중 권한이 없는 메뉴는 숨기기

본문

관리자가 특정회원들(여러명)에게 특정 페이지(페이지 1개)에 권한을 준 상태입니다.

특정회원들이 관리자페이지로 접속시 접근권한이 있는 페이지만 보이게 하고 싶습니다.

2948857999_1737340367.4554.png

권한이 부여된 페이지만 노출을 하고 싶습니다.

2948857999_1737340336.0939.png

이런식으로 권한이 없는 페이지들은 아예 숨겨버리고 싶습니다.

 

권한이 부여된 페이지만, 즉, 왼쪽에 아이콘도 회원관리 아이콘만 떠있게하고, 권한을 가진 특정회원들이 관리자페이지로 접속시 해당 페이지로 이동이 되게 하고 싶습니다ㅠ
2948857999_1737340797.5336.png

결과적으로는 권한을 가진 회원이 관리자페이지 접속시 이렇게 됐으면 합니다.

관리권한 메뉴 검색을 해봤는데 원하는 정보를 얻지못해 질문드립니다.

 


<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);
    }


}

 

답변감사드립니다!
와... 왜 not has 로 처리할 생각을 못했을까요...?! 머리속에 개발로 풀어야하나 라는 생각에 갇혀있었네요...!!

알려주신 방법으로 한방에 해결됐네요ㅠㅠㅠ

index 에 super 가 아닌 경우의 조건이 걸린 코드는 이해하려면 한번 분석해봐야겠어요!!

답변 감사드립니다ㅠ

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 방식의 쿼리 사용이 권장됨.

*권한 확인이 자주 발생하는 경우,

  조회된 권한 목록을 세션에 저장하여 쿼리를 최소화하는 방법을 고려해 볼 수 있음.

*메뉴가 보이지 않는 대신,

  "접근 권한 없음"과 같은 사용자 피드백 메시지를 추가하면 '사용자 경험'에 도움이 됨.

답변감사드립니다!
답변주신 내용을 토대로 auth_code 를 가져오시길래 해당 값이 어떻게 들어가있는지, 왜 auth_code 를 가져오는건지 이해하려고 db를 확인하던 찰나 답변 중 필드가 잘못되어있네요...
auth_table 에는 mb_id, au_menu, au_auth 필드 이렇게 3개가 있네요...

우선 알려주신 방법에서 auth_code 를 au_menu 로 바꿔보는 작업을 먼저 해보고,
안될 경우 au_menu 에 들어간 메뉴코드(?) 값과 출력해야할 코드값을 대조해서 일치하면 출력하는 방법으로 해봐야겠어요!

auth_code 대신 실제 필드명인 au_menu로 수정은 적절한 방안 같습니다!
메뉴 코드와 au_menu의 값을 비교하여 메뉴를 필터링하는 방식으로 충분히 구현할 수 있을 듯합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 0
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT