In progress

This commit is contained in:
Yaojia Wang
2025-11-03 20:02:41 +01:00
parent cbc040621f
commit 32a25b3b35
10 changed files with 6500 additions and 1 deletions

View File

@@ -31,6 +31,15 @@ public class TenantUsersController : ControllerBase
[FromQuery] int pageSize = 20,
[FromQuery] string? search = null)
{
// SECURITY: Validate user belongs to target tenant
var userTenantIdClaim = User.FindFirst("tenant_id")?.Value;
if (userTenantIdClaim == null)
return Unauthorized(new { error = "Tenant information not found in token" });
var userTenantId = Guid.Parse(userTenantIdClaim);
if (userTenantId != tenantId)
return StatusCode(403, new { error = "Access denied: You can only manage users in your own tenant" });
var query = new ListTenantUsersQuery(tenantId, pageNumber, pageSize, search);
var result = await _mediator.Send(query);
return Ok(result);
@@ -46,6 +55,15 @@ public class TenantUsersController : ControllerBase
[FromRoute] Guid userId,
[FromBody] AssignRoleRequest request)
{
// SECURITY: Validate user belongs to target tenant
var userTenantIdClaim = User.FindFirst("tenant_id")?.Value;
if (userTenantIdClaim == null)
return Unauthorized(new { error = "Tenant information not found in token" });
var userTenantId = Guid.Parse(userTenantIdClaim);
if (userTenantId != tenantId)
return StatusCode(403, new { error = "Access denied: You can only manage users in your own tenant" });
var command = new AssignUserRoleCommand(tenantId, userId, request.Role);
await _mediator.Send(command);
return Ok(new { Message = "Role assigned successfully" });
@@ -60,13 +78,23 @@ public class TenantUsersController : ControllerBase
[FromRoute] Guid tenantId,
[FromRoute] Guid userId)
{
// SECURITY: Validate user belongs to target tenant
var userTenantIdClaim = User.FindFirst("tenant_id")?.Value;
if (userTenantIdClaim == null)
return Unauthorized(new { error = "Tenant information not found in token" });
var userTenantId = Guid.Parse(userTenantIdClaim);
if (userTenantId != tenantId)
return StatusCode(403, new { error = "Access denied: You can only manage users in your own tenant" });
var command = new RemoveUserFromTenantCommand(tenantId, userId);
await _mediator.Send(command);
return Ok(new { Message = "User removed from tenant successfully" });
}
/// <summary>
/// Get available roles
/// Get available roles (Note: This endpoint doesn't use tenantId from route, so tenant validation is skipped.
/// It only returns static role definitions, not tenant-specific data.)
/// </summary>
[HttpGet("../roles")]
[Authorize(Policy = "RequireTenantAdmin")]