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