有些系统,比如B2C的商城,虽然有多个角色,但角色都是稳定的权限不变的,使用User和Role就可以,没有必要为了应用RBAC而引入Permission类,强行引入虽然实现了Role和Permission的分配回收功能,但实际上不会使用,只会使用User的Role授权功能。权限的抽象要做到满足授权需求即可,在角色就能满足授权需求的情况下,角色和权限的概念是一体的。后台实现权限管理只需要实现对用户角色的管理。
(3)需要对角色进行动态授权的系统
有些系统,比如ERP,有多个不稳定的角色,每个角色通常对应多项权限,由于组织机构和人员职责的变化,必须对角色的权限进行动态分配,需要使用User、Role和Permission的组合。User由于权限范围的不同,通常具有一个或多个权限,不同的User具有的角色通常不再是平行关系而是层级关系,如果不从Role中抽象Permission,需要定义大量的Role对应不同权限的组合,遇到这种情况时,分离权限,对角色进行权限管理就成了必然。后台实现权限管理即需要实现对用户角色的管理也需要实现对角色权限的管理。
RBACContext.SetRBACUser(u => { var user = ObjectFactory.GetInstance<IUserService>().GetUserByName(u); return new RBACUser { UserName = user.UserName, Roles = user.Roles.Select(r => new RBACRole { RoleName = r.RoleName, Permissions = r.Permissions.Select(p => new RBACPermission { PermissionName = p.Name }).ToList() }).ToList() }; });
8.总结使用RBAC模型和.NET的权限验证API解决了权限系统的复用问题,从角色的稳定性出发防止实体类规模膨胀,通过最小授权需求的抽象可以防止权限的滥用。
参考:
(1)https://en.wikipedia.org/wiki/Role-based_access_control
(2)
(3)
(4)
Demo下载