| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815 |
- using Microsoft.AspNetCore.Authorization;
- using System.Security.Claims;
- namespace SharedKernel.Constants;
- public class Menu
- {
- public int Id { get; set; }
- public required string Name { get; set; }
- public string? Path { get; set; }
- public string? Icon { get; set; }
- public List<Menu>? Children { get; set; } = [];
- public bool HasChildren => Children != null && Children.Count > 0;
- // 이 메뉴를 볼 수 있는 역할 목록 (없으면 모두 허용)
- public List<string>? Roles { get; set; }
- // 정책 이름으로도 제한 가능하게
- public List<string>? Policies { get; set; }
- }
- public static class Menus
- {
- public static List<Menu> GetMenus()
- {
- return new List<Menu>
- {
- new Menu
- {
- Id = 100,
- Name = "상황판",
- Path = "/",
- Icon = "<i class=\"bi bi-speedometer\"></i>",
- Children = null,
- Roles = [ "Admin", "상황판" ],
- Policies = null
- },
- new Menu
- {
- Id = 200,
- Name = "환경",
- Path = null,
- Icon = "<i class=\"bi bi-gear\"></i>",
- Roles = [ "Admin", "환경" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 201,
- Name = "서버 정보",
- Path = "/Server/Info",
- Roles = [ "Admin", "환경 - 서버 정보" ],
- Policies = null
- },
- new Menu
- {
- Id = 202,
- Name = "환경변수",
- Path = "/Server/Env",
- Roles = [ "Admin", "환경 - 환경변수" ]
- },
- new Menu
- {
- Id = 203,
- Name = "기본 설정",
- Path = "/Config/Basic",
- Roles = [ "Admin", "환경 - 기본 설정" ]
- },
- new Menu
- {
- Id = 204,
- Name = "메타 태그",
- Path = "/Config/Meta",
- Roles = [ "Admin", "환경 - 메타 태그" ]
- },
- new Menu
- {
- Id = 205,
- Name = "회사 정보",
- Path = "/Config/Company",
- Roles = [ "Admin", "환경 - 회사 정보" ]
- },
- new Menu
- {
- Id = 206,
- Name = "회원 설정",
- Path = "/Config/Register",
- Roles = [ "Admin", "환경 - 회원 설정" ]
- },
- new Menu
- {
- Id = 207,
- Name = "알림 발송 확인",
- Path = "/Config/Test/Email",
- Roles = [ "Admin", "환경 - 알림 발송 확인" ]
- },
- new Menu
- {
- Id = 208,
- Name = "알림 발송 양식",
- Path = "/Config/Template/Email",
- Roles = [ "Admin", "환경 - 알림 발송 양식" ]
- },
- new Menu
- {
- Id = 209,
- Name = "API 설정",
- Path = "/Config/External",
- Roles = [ "Admin", "환경 - API 설정" ]
- },
- new Menu
- {
- Id = 210,
- Name = "Cache 관리",
- Path = "/Server/Cache",
- Roles = [ "Admin", "환경 - Cache 관리" ]
- },
- new Menu
- {
- Id = 211,
- Name = "출석 관리",
- Path = "/Config/Attendance",
- Roles = [ "Admin", "환경 - 출석 관리" ]
- },
- new Menu
- {
- Id = 212,
- Name = "결제 설정",
- Path = "/Config/Payment",
- Roles = [ "Admin", "환경 - 결제 설정" ]
- }
- }
- },
- new Menu
- {
- Id = 250,
- Name = "관리자",
- Path = null,
- Icon = "<i class=\"bi bi-person-fill-gear\"></i>",
- Roles = [ "Admin", "관리자" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 251,
- Name = "회원 관리",
- Path = "/Director/User",
- Roles = [ "Admin", "관리자 회원" ]
- },
- new Menu
- {
- Id = 252,
- Name = "로그인 내역",
- Path = "/Director/LoginLog",
- Roles = [ "Admin", "관리자 - 로그인 내역" ]
- },
- new Menu
- {
- Id = 253,
- Name = "접근 기록",
- Path = "/Director/AccessLog",
- Roles = [ "Admin", "관리자 - 처리 기록" ]
- }
- }
- },
- new Menu
- {
- Id = 300,
- Name = "일반",
- Path = null,
- Icon = "<i class=\"bi bi-card-heading\"></i>",
- Roles = [ "Admin", "일반" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 301,
- Name = "문서 관리",
- Path = "/Document",
- Roles = [ "Admin", "일반 - 문서 관리" ]
- },
- new Menu
- {
- Id = 302,
- Name = "팝업 관리",
- Path = "/Popup",
- Roles = [ "Admin", "일반 - 팝업 관리" ]
- },
- new Menu
- {
- Id = 303,
- Name = "FAQ 관리",
- Path = "/Faq/List",
- Roles = [ "Admin", "일반 - FAQ 관리" ]
- },
- new Menu
- {
- Id = 304,
- Name = "배너 관리",
- Path = "/Banner/List",
- Roles = [ "Admin", "일반 - 배너 관리" ]
- },
- new Menu
- {
- Id = 305,
- Name = "메일 관리",
- Path = "/Mail/List",
- Roles = [ "Admin", "일반 - 메일 관리" ]
- }
- }
- },
- new Menu
- {
- Id = 400,
- Name = "회원",
- Path = null,
- Icon = "<i class=\"bi bi-people\"></i>",
- Roles = [ "Admin", "회원" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 401,
- Name = "회원 목록",
- Path = "/Member/List",
- Roles = [ "Admin", "회원 - 회원 목록" ]
- },
- new Menu
- {
- Id = 402,
- Name = "회원 등급",
- Path = "/Member/Grade",
- Roles = [ "Admin", "회원 - 회원 등급" ]
- },
- new Menu
- {
- Id = 403,
- Name = "현재 접속자",
- Path = "/Member/Visitor",
- Roles = [ "Admin", "회원 - 현재 접속자" ]
- },
- new Menu
- {
- Id = 411,
- Name = "채팅 접속자",
- Path = "/Member/ChatVisitor",
- Roles = [ "Admin", "회원 - 채팅 접속자" ]
- },
- new Menu
- {
- Id = 404,
- Name = "로그인 내역",
- Path = "/Member/Log/Login",
- Roles = [ "Admin", "회원 - 로그인 내역" ]
- },
- new Menu
- {
- Id = 405,
- Name = "이메일 변경 내역",
- Path = "/Member/Log/Email",
- Roles = [ "Admin", "회원 - 이메일 변경 내역" ]
- },
- new Menu
- {
- Id = 406,
- Name = "별명 변경 내역",
- Path = "/Member/Log/Name",
- Roles = [ "Admin", "회원 - 별명 변경 내역" ]
- },
- new Menu
- {
- Id = 407,
- Name = "한마디 변경 내역",
- Path = "/Member/Log/Summary",
- Roles = [ "Admin", "회원 - 한마디 변경 내역" ]
- },
- new Menu
- {
- Id = 408,
- Name = "자기소개 변경 내역",
- Path = "/Member/Log/Intro",
- Roles = [ "Admin", "회원 - 자기소개 변경 내역" ]
- },
- new Menu
- {
- Id = 409,
- Name = "지갑 관리",
- Path = "/Member/Wallet/List",
- Roles = [ "Admin", "회원 - 지갑 관리", "Joblepay" ]
- },
- new Menu
- {
- Id = 410,
- Name = "거래 장부",
- Path = "/Member/Wallet/Transactions",
- Roles = [ "Admin", "회원 - 거래 장부" ]
- }
- }
- },
- new Menu
- {
- Id = 500,
- Name = "게시판",
- Path = null,
- Icon = "<i class=\"bi bi-clipboard2\"></i>",
- Roles = [ "Admin", "게시판" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 501,
- Name = "분류 관리",
- Path = "/Forum/Board/Group",
- Roles = [ "Admin", "게시판 - 분류 관리" ]
- },
- new Menu
- {
- Id = 502,
- Name = "게시판 관리",
- Path = "/Forum/Board/List",
- Roles = [ "Admin", "게시판 - 게시판 관리" ]
- },
- new Menu
- {
- Id = 503,
- Name = "게시물 관리",
- Path = "/Forum/Posts/List",
- Roles = [ "Admin", "게시판 - 게시물 관리" ]
- },
- new Menu
- {
- Id = 504,
- Name = "휴지통",
- Path = "/Forum/Trash/Post",
- Roles = [ "Admin", "게시판 - 휴지통" ]
- },
- new Menu
- {
- Id = 505,
- Name = "첨부파일",
- Path = "/Forum/Attachments/PostFile",
- Roles = [ "Admin", "게시판 - 첨부파일" ]
- },
- new Menu
- {
- Id = 506,
- Name = "이미지",
- Path = "/Forum/Attachments/PostImage",
- Roles = [ "Admin", "게시판 - 이미지" ]
- },
- new Menu
- {
- Id = 507,
- Name = "반응 관리",
- Path = "/Forum/Reactions/Post",
- Roles = [ "Admin", "게시판 - 반응 관리" ]
- },
- new Menu
- {
- Id = 508,
- Name = "신고 관리",
- Path = "/Forum/Reports/Post",
- Roles = [ "Admin", "게시판 - 신고 관리" ]
- }
- }
- },
- new Menu
- {
- Id = 600,
- Name = "댓글",
- Path = null,
- Icon = "<i class=\"bi bi-chat\"></i>",
- Roles = [ "Admin", "댓글" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 601,
- Name = "댓글 관리",
- Path = "/Forum/Comments/List",
- Roles = [ "Admin", "댓글 - 댓글 관리" ]
- },
- new Menu
- {
- Id = 602,
- Name = "휴지통",
- Path = "/Forum/Trash/Comment",
- Roles = [ "Admin", "댓글 - 휴지통" ]
- },
- new Menu
- {
- Id = 603,
- Name = "첨부파일",
- Path = "/Forum/Attachments/CommentFile",
- Roles = [ "Admin", "댓글 - 첨부파일" ]
- },
- new Menu
- {
- Id = 604,
- Name = "이미지",
- Path = "/Forum/Attachments/CommentImage",
- Roles = [ "Admin", "댓글 - 이미지" ]
- },
- new Menu
- {
- Id = 605,
- Name = "반응 관리",
- Path = "/Forum/Reactions/Comment",
- Roles = [ "Admin", "댓글 - 반응 관리" ]
- },
- new Menu
- {
- Id = 606,
- Name = "신고 관리",
- Path = "/Forum/Reports/Comment",
- Roles = [ "Admin", "댓글 - 신고 관리" ]
- }
- }
- },
- new Menu
- {
- Id = 700,
- Name = "채널",
- Path = null,
- Icon = "<i class=\"bi bi-person-lines-fill\"></i>",
- Roles = [ "Admin", "채널" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 701,
- Name = "채널 목록",
- Path = "/Channel/List",
- Roles = [ "Admin", "채널 - 채널 목록" ]
- },
- new Menu
- {
- Id = 702,
- Name = "경험치 관리",
- Path = "/Channel/Exp",
- Roles = [ "Admin", "채널 - 경험치 관리" ]
- },
- new Menu
- {
- Id = 703,
- Name = "YouTube 구독",
- Path = "/Channel/YouTubePubSub",
- Roles = [ "Admin", "채널 - YouTube 구독" ]
- }
- }
- },
- new Menu
- {
- Id = 800,
- Name = "결제",
- Path = null,
- Icon = "<i class=\"bi bi-wallet2\"></i>",
- Roles = [ "Admin", "결제" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 801,
- Name = "다날 결제 내역",
- Path = "/Payments/Danal/Confirm",
- Roles = [ "Admin", "결제 - 다날 결제 내역" ]
- },
- new Menu
- {
- Id = 802,
- Name = "다날 취소 내역",
- Path = "/Payments/Danal/Cancel",
- Roles = [ "Admin", "결제 - 다날 취소 내역" ]
- },
- new Menu
- {
- Id = 803,
- Name = "다날 오류 내역",
- Path = "/Payments/Danal/Error",
- Roles = [ "Admin", "결제 - 다날 오류 내역" ]
- }
- }
- },
- new Menu
- {
- Id = 900,
- Name = "후원",
- Path = null,
- Icon = "<i class=\"bi bi-currency-exchange\"></i>",
- Roles = [ "Admin", "후원" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 901,
- Name = "후원 내역",
- Path = "/Donation/List",
- Roles = [ "Admin", "후원 - 후원 내역" ]
- },
- new Menu
- {
- Id = 902,
- Name = "후원 알림",
- Path = "/Donation/Alert",
- Roles = [ "Admin", "후원 - 후원 알림" ]
- },
- new Menu
- {
- Id = 903,
- Name = "후원 순위",
- Path = "/Donation/Rank",
- Roles = [ "Admin", "후원 - 후원 순위" ]
- }
- }
- },
- new Menu
- {
- Id = 1200,
- Name = "개발자 API",
- Path = null,
- Icon = "<i class=\"bi bi-code-slash\"></i>",
- Roles = [ "Admin", "개발자 API" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 1201,
- Name = "계정 관리",
- Path = "/Developers/Accounts",
- Roles = [ "Admin", "개발자 API - 계정 관리" ]
- },
- new Menu
- {
- Id = 1202,
- Name = "앱 관리",
- Path = "/Developers/Apps",
- Roles = [ "Admin", "개발자 API - 앱 관리" ]
- },
- new Menu
- {
- Id = 1203,
- Name = "결제 보고",
- Path = "/Developers/Purchases",
- Roles = [ "Admin", "개발자 API - 결제 보고" ]
- }
- }
- },
- new Menu
- {
- Id = 1300,
- Name = "게임",
- Path = null,
- Icon = "<i class=\"bi bi-controller\"></i>",
- Roles = [ "Admin", "게임", "상점 - 게임 관리" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 1101,
- Name = "게임 관리",
- Path = "/Store/Game",
- Roles = [ "Admin", "상점 - 게임 관리" ]
- },
- new Menu
- {
- Id = 1107,
- Name = "게임 장르",
- Path = "/Store/GameGenre",
- Roles = [ "Admin", "상점 - 게임 관리" ]
- },
- new Menu
- {
- Id = 1108,
- Name = "게임 카테고리",
- Path = "/Store/GameCategory",
- Roles = [ "Admin", "상점 - 게임 관리" ]
- },
- new Menu
- {
- Id = 1109,
- Name = "게임 언어",
- Path = "/Store/GameLanguage",
- Roles = [ "Admin", "상점 - 게임 관리" ]
- }
- }
- },
- new Menu
- {
- Id = 1100,
- Name = "상점",
- Path = null,
- Icon = "<i class=\"bi bi-shop\"></i>",
- Roles = [ "Admin", "상점" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 1102,
- Name = "상품 관리",
- Path = "/Store/Product",
- Roles = [ "Admin", "상점 - 상품 관리" ]
- },
- new Menu
- {
- Id = 1103,
- Name = "쿠폰 관리",
- Path = "/Store/Coupon",
- Roles = [ "Admin", "상점 - 쿠폰 관리" ]
- },
- new Menu
- {
- Id = 1104,
- Name = "주문 관리",
- Path = "/Store/Order",
- Roles = [ "Admin", "상점 - 주문 관리" ]
- },
- new Menu
- {
- Id = 1105,
- Name = "배송 관리",
- Path = "/Store/Shipment",
- Roles = [ "Admin", "상점 - 배송 관리" ]
- },
- new Menu
- {
- Id = 1106,
- Name = "게임사 정산",
- Path = "/Store/Settlement",
- Roles = [ "Admin", "상점 - 게임사 정산" ]
- }
- }
- },
- /*new Menu
- {
- Id = 1000,
- Name = "정산",
- Path = null,
- Icon = "<i class=\"bi bi-piggy-bank\"></i>",
- Roles = [ "Admin", "정산" ],
- Children = new List<Menu>
- {
- new Menu
- {
- Id = 1001,
- Name = "매출 관리",
- Path = "/Payout/Sales",
- Roles = [ "Admin", "정산 - 매출 관리" ]
- },
- new Menu
- {
- Id = 1002,
- Name = "통계",
- Path = "/Payout/Statistics",
- Roles = [ "Admin", "정산 - 통계" ]
- },
- new Menu
- {
- Id = 1003,
- Name = "회원 정산 내역",
- Path = "/Payout/Settlement/List",
- Roles = [ "Admin", "정산 - 회원 정산 내역" ]
- }
- }
- }*/
- };
- }
- public static async Task<List<Menu>> FilterForUserAsync(ClaimsPrincipal user, IAuthorizationService authorizationService)
- {
- var menus = GetMenus();
- var result = new List<Menu>();
- foreach (var menu in menus)
- {
- var filtered = await FilterMenuRecursiveAsync(menu, user, authorizationService);
- if (filtered != null)
- {
- result.Add(filtered);
- }
- }
- return result;
- }
- private static async Task<Menu?> FilterMenuRecursiveAsync(Menu menu, ClaimsPrincipal user, IAuthorizationService authorizationService)
- {
- // 현재 메뉴에 대한 접근 권한 체크
- if (!await IsMenuAllowedAsync(menu, user, authorizationService))
- {
- // 자식이 있으면, 자식은 볼 수 있지만 부모는 숨기고 싶을 수도 있음
- if (menu.Children is { Count: > 0 })
- {
- var allowedChildren = new List<Menu>();
- foreach (var child in menu.Children)
- {
- var filteredChild = await FilterMenuRecursiveAsync(child, user, authorizationService);
- if (filteredChild != null)
- {
- allowedChildren.Add(filteredChild);
- }
- }
- if (allowedChildren.Count == 0)
- {
- return null;
- }
- return new Menu
- {
- Id = menu.Id,
- Name = menu.Name,
- Path = menu.Path,
- Icon = menu.Icon,
- Roles = menu.Roles,
- Policies = menu.Policies,
- Children = allowedChildren
- };
- }
- return null;
- }
- // 부모는 허용되지만, 자식 중 제한이 있을 수도 있으니
- List<Menu>? filteredChildren = null;
- if (menu.Children is { Count: > 0 })
- {
- filteredChildren = new List<Menu>();
- foreach (var child in menu.Children)
- {
- var filteredChild = await FilterMenuRecursiveAsync(child, user, authorizationService);
- if (filteredChild != null)
- {
- filteredChildren.Add(filteredChild);
- }
- }
- if (filteredChildren.Count == 0)
- {
- filteredChildren = null;
- }
- }
- return new Menu
- {
- Id = menu.Id,
- Name = menu.Name,
- Path = menu.Path,
- Icon = menu.Icon,
- Roles = menu.Roles,
- Policies = menu.Policies,
- Children = filteredChildren
- };
- }
- private static async Task<bool> IsMenuAllowedAsync(Menu menu, ClaimsPrincipal user, IAuthorizationService authorizationService)
- {
- // 로그인 안 한 경우: 익명에게도 보여줄 메뉴만 허용하고 싶으면 분기 추가
- if (!user.Identity?.IsAuthenticated ?? true)
- {
- // 예: 익명은 아무 메뉴도 못 본다고 가정
- return false;
- }
- // Roles 지정되어 있으면 Role 기반 체크
- if (menu.Roles is { Count: > 0 })
- {
- // 하나라도 만족하면 허용
- foreach (var role in menu.Roles)
- {
- if (user.IsInRole(role))
- {
- return true;
- }
- }
- return false;
- }
- // Policies 지정되어 있으면 Policy 기반 체크
- if (menu.Policies is { Count: > 0 })
- {
- foreach (var policy in menu.Policies)
- {
- var authResult = await authorizationService.AuthorizeAsync(user, policy);
- if (authResult.Succeeded)
- {
- return true;
- }
- }
- return false;
- }
- // 역할/정책 제한이 없으면 모두 허용
- return true;
- }
- }
|