我们使用AD来确定用户所属的角色,然后检查任何一个角色是否具有正确的权限。但是您可以使用
roles
和
userroles
表来自行完成此部分。
使用这两种方法之一,用户将处于一组角色中。这是第一步。
然后,在执行操作时,您需要验证用户是否具有权限。我们的菜单结构是从数据库动态构建的,因此我有一个
MenuItems
表,然后是定义
RoleMenuAvailability
的表。
第一个表具有
Id
、
order
、
Title
、
Image source
和
navigation target
,以及其他一些字段。
第二个表具有
RoleId
和
menuId
以及它是否可编辑。因此,行的存在意味着它是可读的(如果是导航目标即表单)。然后从数据库中读取菜单项:
var usersItems =
items.Where(i => i.RoleMenuAvailabilities
.Any(r => domainUser.IsInDomainRole(r.UserRole.Description)))
.OrderBy(m => m.MenuOrder);
UserRole.Description
在我们的情况下是 AD 角色的名称,而 IsInDomainRole
是一个辅助函数:
public bool IsInDomainRole(string role)
{
var regex = new Regex("[^\\\\]+$");
string name = this.Name ?? string.Empty;
string domainRole = regex.Replace(name, role);
return this.IsInRole(domainRole);
}
rolemenuavailability
表可以扩展,增加删除、更新、添加等附加标志。
我们还没有完全实现下一阶段,但意图是将用户权限缓存到用户中。我们的ViewModel基类引用了用户,因此可以调用CanEdit(int permissionId)
函数。然后,控制可见性或命令CanExecute
的属性可以访问用户权限,并查找他们是否具有任何操作的权限。
这仍然是一个正在进行中的工作,所以很想看看这里还有什么其他建议。