前后端分离系统的权限设计

前后端分离系统的权限设计

概述

Marble权限系统是控制marble用户访问的系统,它支持针对于角色的资源授权,提供一套API允许用户对权限进行增删查改等操作。

概念简介

基本概念

Resource

在权限系统中,Resource可以表示可以被授权访问的主体。比如,在marble系统中,API接口可以算作一类资源,它可以通过配置的方式允许特定用户对其调用;模块也是一种资源,比如课程表模块,它可以允许用户对其进行查看。

资源使用Ari来表示,它的结构如下:

ari:{service}:{region}:{account}:{resourceType}:{resource}
  • {service} - 服务名称,对于marble系统,固定为 marble
  • {region} - 地域名称,目前为空
  • {account} - 账号ID,对于marble系统,此为资源所在的projectId,如果资源不属于某个project为空
  • {resourceType} - 资源类型,如branchModule,method等。
  • {resource} - 资源名,也就是资源的相对路径,比如 projects/1/branches/1/modules/member/potential_student

Action

表示对资源的操作,比如对于场地模块,它提供了create(新建)、view(查看)、update(修改)操作。

Effect

表示为禁止访问(allow)还是允许访问(deny)

Condition

表示访问时满足的条件,比如对修改潜在会员api进行调用时,如果其修改的潜在会员的salesAdviserId为1,则此次访问满足 ParamMatch: {"salesAdviserId": [1]} 这个条件。

Privilege

Privilege是指对某个资源的某个操作在某种条件下的限制策略(允许还是禁止),它是Resource,Action,Effect,Condition的组合;一个实例的Privilege如下:

    {
      "resource": "ari:marble::1:branch_module:projects/1/branches/1/modules/member/potential_student",
      "action": "update",
      "effect": "allow",
      "condition": {
        "actMatch": [
          "salesAdviserIsPrincipal"
        ]
      }
    }

如果某个用户具有此Privilege,则当其对于某个branch(projectId为1,branchId为1的branch)下的potential_student模块进行update操作时(修改潜在会员信息),且修改的潜在会员信息的销售顾问是自己时(符合condition),可以允许其访问。

权限的检查方式

每个用户都有一组权限列表,当用户对某个资源进行某个操作的时候,系统会取出此用户具有的此资源此操作的所有Privilege,并逐条匹配Condition是否符合当前操作,并通过以下规则判断是否允许用户继续操作:

  • 当某条Privilege的condition匹配当前操作,且effect为deny,拒绝此操作。
  • 当某条Privilege的condition匹配当前操作,且effect为allow,且没有符合条件的deny操作,允许此操作。
  • 当没有任何Privilege的condition匹配,拒绝此操作

可授权的资源

API资源

是指访问某个API的权限,此资源只有一种操作即 execute ,表示请求此api。目前没有接口直接允许用户设置API的授权,其授权通过模块授权间接完成

Module资源(模块资源)

模块是一个前端的概念,比如会员模块表示前端对会员的相关操作;同时模块映射了一组API,对模块的授权可以间接允许或拒绝用户对某个API的访问。

模块分成两类,project模块以及branch模块。

project模块的ari表示如下:

ari:marble::{projectId}:project_module:projects/{projectId}/modules/{moduleName}

branch模块的ari表示如下:

ari:marble::{projectId}:branch_module:projects/{projectId}/branches/{branchId}/modules/{moduleName}

模块的condition现在仅支持 actMatch , 有如下选项:

名称 说明
salesAdviserIsPrincipal 销售顾问为自己
coachIsPrincipal 教练为自己

Role (角色)

角色可以拥有一组privilege,用户可以属于一个或者多个角色;当用户属于一个角色时,其会拥有这个角色所有的权限。

权限系统API

获取所有module信息

  • 语法

获取project级别下的模块

GET /api/v1/projects/{projectId}/modules

获取branch级别下的模块

GET /api/v1/projects/{projectId}/branches/{branchId}/modules
  • 请求参数
参数 是否必须 说明
projectId project的id
branchId branch的id
  • 返回参数
参数

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 12:22:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 12:22:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 12:22:03       82 阅读
  4. Python语言-面向对象

    2024-05-02 12:22:03       91 阅读

热门阅读

  1. JVM

    JVM

    2024-05-02 12:22:03      32 阅读
  2. JVM对象锁的升级过程

    2024-05-02 12:22:03       35 阅读
  3. 体现记录表(wst_cash_draws)

    2024-05-02 12:22:03       27 阅读
  4. 附加功率效率 PAE 测试方法

    2024-05-02 12:22:03       29 阅读
  5. git常用命令大全

    2024-05-02 12:22:03       34 阅读
  6. 7-45 最小支撑树

    2024-05-02 12:22:03       33 阅读
  7. PyTorch与深度学习:探索人工智能的新前沿

    2024-05-02 12:22:03       37 阅读
  8. C# Windows Forms 应用程序中连接到 数据库

    2024-05-02 12:22:03       34 阅读
  9. 【c++】【贪心】机器生产

    2024-05-02 12:22:03       32 阅读