using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using LingAdmin.AuthorizationService.Services; using LingAdmin.Shared.DTOs; using System.Security.Claims; namespace LingAdmin.AuthorizationService.Controllers; /// /// 授权控制器 - 处理权限验证和查询 /// [ApiController] [Route("api/[controller]")] public class AuthorizationController : ControllerBase { private readonly IRoleService _roleService; private readonly IPermissionService _permissionService; private readonly ILogger _logger; public AuthorizationController( IRoleService roleService, IPermissionService permissionService, ILogger logger) { _roleService = roleService; _permissionService = permissionService; _logger = logger; } /// /// 获取用户的角色和权限(用于服务间调用) /// [HttpGet("users/{userId}/permissions")] public async Task>> GetUserPermissions(int userId) { var result = await _permissionService.GetUserRolesAndPermissionsAsync(userId); return Ok(ApiResponse.Ok(result)); } /// /// 获取用户的角色列表 /// [HttpGet("users/{userId}/roles")] public async Task>>> GetUserRoles(int userId) { var roles = await _roleService.GetUserRoleDetailsAsync(userId); return Ok(ApiResponse>.Ok(roles)); } /// /// 检查用户是否有指定权限 /// [HttpGet("users/{userId}/check")] public async Task> CheckPermission(int userId, [FromQuery] string permission) { var hasPermission = await _permissionService.HasPermissionAsync(userId, permission); return Ok(new { HasPermission = hasPermission }); } /// /// 获取当前用户的权限 /// [Authorize] [HttpGet("me/permissions")] public async Task> GetMyPermissions() { var userId = GetCurrentUserId(); if (userId == null) { return Unauthorized(); } var result = await _permissionService.GetUserRolesAndPermissionsAsync(userId.Value); return Ok(result); } /// /// 获取所有权限列表 /// [Authorize(Roles = "Admin,SuperAdmin")] [HttpGet("permissions")] public async Task>>> GetAllPermissions() { var permissions = await _permissionService.GetAllPermissionsAsync(); return Ok(ApiResponse>.Ok(permissions)); } /// /// 按资源获取权限 /// [Authorize(Roles = "Admin,SuperAdmin")] [HttpGet("permissions/resource/{resource}")] public async Task>>> GetPermissionsByResource(string resource) { var permissions = await _permissionService.GetPermissionsByResourceAsync(resource); return Ok(ApiResponse>.Ok(permissions)); } private int? GetCurrentUserId() { var userIdClaim = User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (int.TryParse(userIdClaim, out var userId)) { return userId; } return null; } }