|
|
@@ -0,0 +1,645 @@
|
|
|
+using Microsoft.AspNetCore.Authorization;
|
|
|
+using System.Security.Claims;
|
|
|
+
|
|
|
+namespace Admin.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 = new List<string> { "Admin", "상황판" },
|
|
|
+ Policies = null
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 200,
|
|
|
+ Name = "환경",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-gear\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "환경" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 201,
|
|
|
+ Name = "서버 정보",
|
|
|
+ Path = "/Systems/Server",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 서버 정보" },
|
|
|
+ Policies = null
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 202,
|
|
|
+ Name = "환경변수",
|
|
|
+ Path = "/Systems/Envs",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 환경변수" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 203,
|
|
|
+ Name = "기본 설정",
|
|
|
+ Path = "/Systems/Basic",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 기본 설정" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 204,
|
|
|
+ Name = "메타 태그",
|
|
|
+ Path = "/Systems/Meta",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 메타 태그" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 205,
|
|
|
+ Name = "회사 정보",
|
|
|
+ Path = "/Systems/Company",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 회사 정보" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 207,
|
|
|
+ Name = "회원 설정",
|
|
|
+ Path = "/Systems/Register",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 회원 설정" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 208,
|
|
|
+ Name = "알림 발송 확인",
|
|
|
+ Path = "/Systems/Test",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 알림 발송 확인" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 209,
|
|
|
+ Name = "알림 발송 양식",
|
|
|
+ Path = "/Systems/Template/Email",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 알림 발송 양식" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 211,
|
|
|
+ Name = "API 설정",
|
|
|
+ Path = "/Systems/External",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - API 설정" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 212,
|
|
|
+ Name = "결제 설정",
|
|
|
+ Path = "/Systems/Payment",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 결제 설정" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 213,
|
|
|
+ Name = "관리자",
|
|
|
+ Path = "/Director/User",
|
|
|
+ Roles = new List<string> { "Admin", "환경 - 관리자" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 300,
|
|
|
+ Name = "일반",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-card-heading\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "일반" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 301,
|
|
|
+ Name = "문서 관리",
|
|
|
+ Path = "/Page/Document",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - 문서 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 302,
|
|
|
+ Name = "FAQ 관리",
|
|
|
+ Path = "/Page/Faq/Item",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - FAQ 관리" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 3021,
|
|
|
+ Name = "FAQ 분류",
|
|
|
+ Path = "/Page/Faq/Category",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - FAQ 분류" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 3022,
|
|
|
+ Name = "FAQ 항목",
|
|
|
+ Path = "/Page/Faq/Item",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - FAQ 항목" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 303,
|
|
|
+ Name = "팝업 관리",
|
|
|
+ Path = "/Page/Popup",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - 팝업 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 304,
|
|
|
+ Name = "배너 관리",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - 배너 관리" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 3041,
|
|
|
+ Name = "배너 위치",
|
|
|
+ Path = "/Page/Banner/Position",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - 배너 위치" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 3042,
|
|
|
+ Name = "배너 관리",
|
|
|
+ Path = "/Page/Banner/Item",
|
|
|
+ Roles = new List<string> { "Admin", "일반 - 배너 관리" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 400,
|
|
|
+ Name = "회원",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-people\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "회원" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 401,
|
|
|
+ Name = "회원 목록",
|
|
|
+ Path = "/Member/List",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 회원 목록" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 402,
|
|
|
+ Name = "회원 등급",
|
|
|
+ Path = "/Member/Grade",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 회원 등급" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 403,
|
|
|
+ Name = "현재 접속자",
|
|
|
+ Path = "/Member/Visitor",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 현재 접속자" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 404,
|
|
|
+ Name = "로그인 내역",
|
|
|
+ Path = "/Member/Log/Login",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 로그인 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 405,
|
|
|
+ Name = "이메일 변경 내역",
|
|
|
+ Path = "/Member/Log/Email",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 이메일 변경 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 406,
|
|
|
+ Name = "별명 변경 내역",
|
|
|
+ Path = "/Member/Log/Name",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 별명 변경 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 407,
|
|
|
+ Name = "한마디 변경 내역",
|
|
|
+ Path = "/Member/Log/Summary",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 한마디 변경 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 408,
|
|
|
+ Name = "자기소개 변경 내역",
|
|
|
+ Path = "/Member/Log/Intro",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 자기소개 변경 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 409,
|
|
|
+ Name = "지갑 관리",
|
|
|
+ Path = "/Member/Wallet/List",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 지갑 관리", "Joblepay" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 410,
|
|
|
+ Name = "거래 장부",
|
|
|
+ Path = "/Member/Wallet/Transactions",
|
|
|
+ Roles = new List<string> { "Admin", "회원 - 거래 장부" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 500,
|
|
|
+ Name = "게시판",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-clipboard2\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "게시판" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 501,
|
|
|
+ Name = "분류 관리",
|
|
|
+ Path = "/Forum/Board/Group",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 분류 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 502,
|
|
|
+ Name = "게시판 관리",
|
|
|
+ Path = "/Forum/Board/List",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 게시판 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 503,
|
|
|
+ Name = "게시물 관리",
|
|
|
+ Path = "/Forum/Post/List",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 게시물 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 504,
|
|
|
+ Name = "휴지통",
|
|
|
+ Path = "/Forum/Post/Trash",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 휴지통" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 505,
|
|
|
+ Name = "첨부파일",
|
|
|
+ Path = "/Forum/Post/File",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 첨부파일" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 506,
|
|
|
+ Name = "이미지",
|
|
|
+ Path = "/Forum/Post/Image",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 이미지" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 507,
|
|
|
+ Name = "반응 관리",
|
|
|
+ Path = "/Forum/Post/Feedback",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 반응 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 508,
|
|
|
+ Name = "신고 관리",
|
|
|
+ Path = "/Forum/Post/Blame",
|
|
|
+ Roles = new List<string> { "Admin", "게시판 - 신고 관리" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 600,
|
|
|
+ Name = "댓글",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-chat\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "댓글" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 601,
|
|
|
+ Name = "댓글 관리",
|
|
|
+ Path = "/Forum/Comment/List",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 댓글 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 602,
|
|
|
+ Name = "휴지통",
|
|
|
+ Path = "/Forum/Comment/Trash",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 휴지통" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 603,
|
|
|
+ Name = "첨부파일",
|
|
|
+ Path = "/Forum/Comment/File",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 첨부파일" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 604,
|
|
|
+ Name = "이미지",
|
|
|
+ Path = "/Forum/Comment/Image",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 이미지" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 605,
|
|
|
+ Name = "공감 관리",
|
|
|
+ Path = "/Forum/Comment/Feedback",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 공감 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 606,
|
|
|
+ Name = "신고 관리",
|
|
|
+ Path = "/Forum/Comment/Blame",
|
|
|
+ Roles = new List<string> { "Admin", "댓글 - 신고 관리" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 700,
|
|
|
+ Name = "채널",
|
|
|
+ Path = "/Channel/List",
|
|
|
+ Icon = "<i class=\"bi bi-person-lines-fill\"></i>",
|
|
|
+ Children = null,
|
|
|
+ Roles = new List<string> { "Admin", "채널", "채널 - 채널 목록" }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 800,
|
|
|
+ Name = "결제",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-wallet2\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "결제" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 801,
|
|
|
+ Name = "다날 결제 내역",
|
|
|
+ Path = "/Payments/Danal/Confirm",
|
|
|
+ Roles = new List<string> { "Admin", "결제 - 다날 결제 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 802,
|
|
|
+ Name = "다날 취소 내역",
|
|
|
+ Path = "/Payments/Danal/Cancel",
|
|
|
+ Roles = new List<string> { "Admin", "결제 - 다날 취소 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 803,
|
|
|
+ Name = "다날 오류 내역",
|
|
|
+ Path = "/Payments/Danal/Error",
|
|
|
+ Roles = new List<string> { "Admin", "결제 - 다날 오류 내역" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 900,
|
|
|
+ Name = "후원",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-currency-exchange\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "후원" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 901,
|
|
|
+ Name = "후원 내역",
|
|
|
+ Path = "/Donation/List",
|
|
|
+ Roles = new List<string> { "Admin", "후원 - 후원 내역" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 902,
|
|
|
+ Name = "후원 알림",
|
|
|
+ Path = "/Donation/Alert",
|
|
|
+ Roles = new List<string> { "Admin", "후원 - 후원 알림" }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 1000,
|
|
|
+ Name = "정산",
|
|
|
+ Path = null,
|
|
|
+ Icon = "<i class=\"bi bi-piggy-bank\"></i>",
|
|
|
+ Roles = new List<string> { "Admin", "정산" },
|
|
|
+ Children = new List<Menu>
|
|
|
+ {
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 1001,
|
|
|
+ Name = "매출 관리",
|
|
|
+ Path = "/Payout/Sales",
|
|
|
+ Roles = new List<string> { "Admin", "정산 - 매출 관리" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 1002,
|
|
|
+ Name = "통계",
|
|
|
+ Path = "/Payout/Statistics",
|
|
|
+ Roles = new List<string> { "Admin", "정산 - 통계" }
|
|
|
+ },
|
|
|
+ new Menu
|
|
|
+ {
|
|
|
+ Id = 1003,
|
|
|
+ Name = "회원 정산 내역",
|
|
|
+ Path = "/Payout/Settlement/List",
|
|
|
+ Roles = new List<string> { "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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|