AppBoxFuture(九): 组织结构与权限体系

  权限体系是用于约束用户访问或操做资源的权利,这里的“资源”能够指数据,也能够指特定的功能(如审核订单)。一般的权限体系设计是基于角色的访问控制方式,用户经过角色与权限进行关联。做者的实现方式稍微有些不一样,经过组织结构树与权限进行关联,这样能够实现子级节点继承上级节点设置的权限。git

1、数据结构

  • 组织单元(OrgUnit):根据上级标识自引用的表结构,另经过EntityRef引用组织或工做组或员工;
  • 权限模型(PermissionModel):框架内置的元数据,包含已赋予权限的组织单元集合。

2、权限设置

  • 开发时根据业务须要,经过IDE主菜单->New->Permission新建权限模型,另可经过New->Folder建立模型文件夹分门别类管理相关模型;
  • 运行时经过OrgUnits视图(暂简单实现,以下图所示)选择组织单元,而后在“权限设置”面板勾选相应的权限。

注意:请勿将Admin用户的Admin权限取消掉,未作判断会致使无权限。github

3、权限验证

内部用户登陆流程

  • 根据帐号与密码查询员工并验证密码;
  • 查询员工映射的组织单元,造成组织单元路径(如:/公司/部门/员工);
  • 以组织单元路径新建并缓存会话信息。

注意:系统默认的Admin密码:760wb,Test密码:la581缓存

服务内验证权限

  调用服务时,根据会话的组织单元路径与指定的权限比对,可判断当前用户是否具有特定的权限。数据结构

注意:目前未验证权限的服务全部人都可调用。app

  • 服务方法Attribute方式
[InvokePermission(Permissions.Admin || Permissions.Developer)] //可组合
public async Task<EntityList<Entities.OrgUnit>> LoadTreeList()
{
    var q = new TableScan<Entities.OrgUnit>();
    return await q.ToTreeListAsync(t => t.Childs);
}
  • 服务方法内代码验证方式
public async Task SaveOrder(Entities.Order order)
{
    if (!Permissions.SaveOrder)
        throw new Exception("不具有操做权限");
    await EntityStore.SaveAsync(order);
}

4、本篇小结

  本篇主要介绍了框架集成的权限体系的实现方式,Github上的运行时已经更新可测试。若是您有问题或Bug报告,请留言或在Github提交Issue。框架

相关文章
相关标签/搜索