授权
TKWF 通过 [AuthorityFilter] 提供声明式方法级授权,支持 Role-based 和 Policy-based 两种模式。
AuthorityFilter
基本用法
[AuthorityFilter(Roles = "Admin")]
public async Task<Report> GenerateReportAsync() { ... }
当用户不包含 Admin 角色时,调用将抛出 UnauthorizedAccessException。
多角色(OR 逻辑)
// 满足任一角色即可
[AuthorityFilter(Roles = "Admin,Manager")]
public async Task ApproveAsync(long id) { ... }
策略模式
[AuthorityFilter(Policy = "OrderApproval")]
public async Task ApproveOrderAsync(long orderId) { ... }
自定义策略
实现 IAuthorizationPolicy 接口:
public class OrderApprovalPolicy : IAuthorizationPolicy
{
public async Task<bool> AuthorizeAsync(AuthorizationContext context)
{
var user = context.User;
// 管理员直接通过
if (user.Roles.Contains("Admin")) return true;
// 普通用户需要检查权限
return user.Roles.Contains("OrderApprover");
}
}
注册自定义策略:
builder.ConfigWebAppDomain<AppUserInfo, AppDomainInitializer>(options =>
{
options.Authorization.Policies.Add("OrderApproval",
new OrderApprovalPolicy());
});
在 Controller 中使用
// 路径 A:契约先行
public class AuthController<TUserInfo> : ControllerBase<TUserInfo>
where TUserInfo : IUserInfo
{
[AuthorityFilter(Roles = "Admin")]
public async Task<DashboardData> GetDashboardAsync()
{
// 只有 Admin 可以访问
}
}
// 路径 B:标注驱动
[GenerateController]
public class AdminService(DomainUser<AppUserInfo> user)
: DomainServiceBase<AppUserInfo>(user)
{
[AuthorityFilter(Roles = "Admin")]
public async Task<Log> GetSystemLogAsync() { ... }
}
最佳实践
- 最小权限原则 — 默认不加
[AuthorityFilter],只在需要权限的方法上加 - 角色命名规范 — 统一使用
Admin、Manager、User、Guest等标准角色名 - 策略复用 — 多个方法共享相同权限逻辑时,使用 Policy 模式而非重复写 Roles
- 测试覆盖 — 为每个策略编写单元测试