using Atomx.Common.Constants; using Microsoft.AspNetCore.Components.Authorization; using System.Net.Http.Json; using System.Security.Claims; namespace Atomx.Admin.Client.Services { public interface IPermissionService { /// /// 是否拥有权限点 /// /// /// Task HasPermissionAsync(string permission); /// /// 是否拥有指定权限中的一个 /// /// /// Task HasAnyPermissionAsync(params string[] permissions); /// /// 是否拥有指定权限中的所有权限 /// /// /// Task HasAllPermissionsAsync(params string[] permissions); /// /// 获取用户的所有权限 /// /// Task> GetUserPermissionsAsync(); //Task> GetUserRolesAsync(); } public class ClientPermissionService : IPermissionService { private readonly AuthenticationStateProvider _authenticationStateProvider; private readonly HttpClient _httpClient; public ClientPermissionService( AuthenticationStateProvider authenticationStateProvider, HttpClient httpClient) { _authenticationStateProvider = authenticationStateProvider; _httpClient = httpClient; } public async Task HasPermissionAsync(string permission) { // 客户端检查(基于声明) var authState = await _authenticationStateProvider.GetAuthenticationStateAsync(); var user = authState.User; if (!user.Identity?.IsAuthenticated ?? true) return false; // 检查声明中的权限 var hasPermission = user.Claims.Any(c => c.Type == ClaimKeys.Permission && c.Value == permission); if (hasPermission) return true; // 如果声明中没有,调用API验证 //try //{ // return await _httpClient.GetFromJsonAsync($"/api/auth/haspermission?permission={permission}"); //} //catch //{ // return false; //} return false; } public async Task HasAnyPermissionAsync(params string[] permissions) { foreach (var permission in permissions) { if (await HasPermissionAsync(permission)) return true; } return false; } public async Task HasAllPermissionsAsync(params string[] permissions) { foreach (var permission in permissions) { if (!await HasPermissionAsync(permission)) return false; } return true; } public async Task> GetUserPermissionsAsync() { try { return await _httpClient.GetFromJsonAsync>("/api/auth/permissions") ?? new List(); } catch { return new List(); } } public async Task> GetUserRolesAsync() { var authState = await _authenticationStateProvider.GetAuthenticationStateAsync(); var user = authState.User; return user.Claims .Where(c => c.Type == ClaimTypes.Role) .Select(c => c.Value) .ToList(); } } }