如何解决基于组的角色的许可
当前,我使用默认的.net core 3.1身份。我使用用户,角色和角色声明。
规则
- 每个用户可以在多个组中扮演多个角色。
- 每个角色可以具有多个权限。
- 权限是在系统上预定义的。
- 由管理员用户管理的组及其层次结构。所以它是动态的。
- 一个订单可能只有一个群组。
用户
User | Role | Group
-------------------------------
John | Staff | GroupC
Adam | Manager | GroupB
Eva | Staff | GroupB
Harry | Staff | GroupD
Lisa | Manager | GroupC
Lisa | Manager | GroupD
Jane | Admin | GroupA
索赔
- 订单(添加,修改,批准,拒绝,退款,列表)
- ...
角色
- 工作人员(添加,列出)
- 管理器(添加,编辑,批准,拒绝,列出)
- 管理员(所有权限)
- ...
组:
- GroupA
|- GroupB
| |- GroupC
|- GroupD
订单
OrderNo | Group | ...(the other columns)
1 | GroupA | ...
2 | GroupB | ...
3 | GroupC | ...
4 | GroupD | ...
5 | | ...
预期结果
- John仅看到命令3和5,但没有编辑权限或其他任何权限
- Eva仅看到命令2和5,但没有编辑权限或任何其他权限
- Harry仅看到命令4和5,但没有编辑权限或其他任何权限
- Lisa担任订单3、4和5的经理
- 亚当在订单2、3和5上担任经理角色
- 简是管理员。她看到了一切。
开始代码。我有一个名为IHasGroup的接口。此接口将组ID添加到域实体,我尝试添加动态过滤器。但是,在这里工作并不顺利。
public interface IHasGroup {
long? GroupId
}
public class Order : BaseEntity,IHasGroup{
//Order properties here
public long? GroupId {get; set;}
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
foreach (var entityType in modelBuilder.Model.GetEntityTypes()) {
if (typeof(IHasGroup).IsAssignableFrom(entityType)) {
var filterValue = //what come here????
var param = Expression.Parameter(entityType,"p");
var body = Expression.Equal(Expression.Property(param,nameof(IHasGroup.GroupId)),Expression.Constant(filterValue));
var lambda = Expression.Lambda(body,param);
modelBuilder.Entity(entityType).HasQueryFilter(lambda);
}
}
modelBuilder.ApplyConfigurationsFromAssembly(typeof(MyDbContext).Assembly);
}
public interface ICurrentUserService
{
long? UserId { get; }
bool IsAuthenticated { get; }
public bool HasPermission(string claimName);
}
public class CurrentUserService : ICurrentUserService
{
private IHttpContextAccessor _httpContextAccessor;
public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public long? UserId {
get {
var userIdClaim = _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
return long.TryParse(userIdClaim,out var id) ? id : (long?)null;
} private set { }
}
public bool IsAuthenticated => UserId != null && UserId != 0;
public bool HasPermission(string claimName)
{
if (!IsAuthenticated)
{
return false;
}
return _httpContextAccessor.HttpContext.User.Claims.Any(x => x.Type == CustomClaimTypes.Permission &&
x.Value == claimName &&
x.Issuer == "LOCAL AUTHORITY");
}
}
public void ConfigureServices(IServiceCollection services) {
...
var builder = services.AddControllersWithViews();
services.AddRazorPages();
...
services.AddHttpContextAccessor();
services.AddScoped<ICurrentUserService,CurrentUserService>();
RuntimeCompileDebug(builder);
}
我的问题是。现在,用户可能在某些组中具有列表顺序的角色。所以我需要在数据库查询中添加一个过滤器。如何添加?因为它与权限和分组有关。
我不确定我的目的是否足够。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。