Общее управление правами

задняя часть

Базовая архитектура

基本架构

1. Две основные концепции авторитетного уровня

1. Операция

操作Это предопределенный набор интерфейсов API в системе, которые необходимо ограничить. Например, в системе появились следующие интерфейсы API:

GET /users
POST /users
DELETE /users/{id}
GET /categories
POST /categories
DELETE /categories/{id}
GET /articles
POST /articles
DELETE /articles/{id}

Если следующий интерфейс в системе

GET /users
POST /users
DELETE /users
DELETE /categories

Это более важный интерфейс, в то время как другие интерфейсы, на мой взгляд, не очень важны. Затем я определяю следующие 3操作:

{
  "title": "查询用户", 
  "id": "query_users",
  "api": [
    {
      "uri": "/usrs",
      "method": "GET"
    }
  ]
},
{
  "title": "新增/删除用户",
  "id": "change_user",
  "api": [
    {
        "uri": "/users",
        "method": "POST"
    },
    {
        "uri": "/users/{oid}",
        "method": "DELETE"
    }
  ]
},
{
  "title": "删除分类",
  "id": "delete_category",
  "api": [
    {
        "uri": "/categories/{id}",
        "method": "DELETE"
    }
  ]
}

2. Авторизация авторизация
授权это глагол.
Теперь я хочу, чтобы только пользователи с идентификатором 32 могли выполнять вышеуказанные 3 действия.操作, то есть: вышеуказанные 3 операции授权Для этого пользователя, у которого id равен 32, в домене авторизации будут следующие данные:

{
    "operation_id": "query_users",
    "identities": [
      {
        "key": "user",
        "value": "32"
      }
    ],
    "auth": "allow",
    "priority": 1
},
{
    "operation_id": "change_user",
    "identities": [
      {
        "key": "user",
        "value": "32"
      }
    ],
    "auth": "allow",
    "priority": 1
},
{
    "operation_id": "delete_category",
    "identities": [
      {
        "key": "user",
        "value": "32"
      }
    ],
    "auth": "allow",
    "priority": 1
}

Примечание. В настоящее время авторизация по умолчанию передается как разрешающая, а приоритет передается равным 1. Если вы столкнулись со сложной системой разрешений, рассмотрите ее.

Через некоторое время я хочу сделать id 5用户组в состоянии выполнять删除分类это操作, то отправляю
POST /permissions/key/group/value/5

"opreation": "delete_category",
"auth": "allow",
"priority": 1

Таким образом, данные в конечном домене авторизации становятся такими:

{
    "operation_id": "query_users",
    "identities": [
      {
        "key": "user",
        "value": "32"
      }
    ],
    "auth": "allow",
    "priority": 1
},
{
    "operation_id": "change_user",
    "identities": [
      {
        "key": "user",
        "value": "32"
      }
    ],
    "auth": "allow",
    "priority": 1
},
{
    "operation_id": "delete_category",
    "identities": [
      {
        "key": "user",
        "value": "32"
      },
      {
        "key": "group",
        "value": "5"
      }
    ],
    "auth": "allow",
    "priority": 1
}

Затем, когда я получаю доступ к этим интерфейсам, уровень полномочий получает всю информацию о текущем пользователе, а затем переходит к домену авторизации для проверки авторизации. Пример:

  • Если мой идентификатор пользователя равен 12, я посещаюPOST /usersПри использовании интерфейса уровень разрешений вернет ошибку 403.
  • Если мой идентификатор пользователя 13 и идентификатор группы пользователей я в течение 5, я доступа кPOST /usersИнтерфейс вернет ошибку 403 при доступеDELETE /categories/{id}можно нормально зайти
  • Если мой идентификатор пользователя равен 32, то при доступе ко всем интерфейсам уровень разрешений не будет возвращать 403.

Во-вторых, задняя часть

Когда система подключена к уровню разрешений, в первую очередь необходимо составить список всех API-интерфейсов, а затем найти наиболее важные интерфейсы и определить их.操作, уровень разрешений автоматически выполнит определение авторизации API.

Для типичной системы будут некоторые API-интерфейсы, которые не проходят через уровень разрешений, например, интерфейс входа пользователя, какой-то общедоступный интерфейс данных, открытый для всех и т. д.

В-третьих, передняя часть

Передняя часть должна делать 2 вещи
1. Управление меню
Предположим, что интерфейс системы выглядит так:

- 用户管理   
     [新增]
     id: 1     name: 张三     sex: 男     [删除]
     id: 2     name: 李四     sex: 男     [删除]
- 分类管理
    [新增]
    id: 1      name: 分类1     [删除]   
    id: 2      name: 分类2     [删除]
- 文章管理
    [新增]
    id: 1      name: 文章1     [详情][删除]
    id: 2      name: 文章2     [详情][删除]

Передняя и задняя стороны должны сначала согласовать все операцииoperations, то есть: интерфейс должен знать, что в текущей системе всего 3 операции:query_users,change_user,delete_category.
Таким образом, внешний интерфейс сначала определяет значение по умолчанию:

var operations = [
  query_users = false,
  change_user = false,
  delete_category = false
];

потом
в меню用户管理Установите значение отображения вdisplay=operations.query_users
в управлении пользователями新增а также删除Значение отображения устанавливается на кнопкеdisplay=operations.change_user
управляется по категориям删除Значение отображения устанавливается на кнопкеdisplay=operations.delete_category

Затем, когда пользователь входит в систему, внешний интерфейс должен активно запрашивать интерфейс.GET /users/{id}{id}— это идентификатор текущего пользователя.Помимо возврата основной информации о текущем пользователе, интерфейс дополнительно вернет массив разрешений, в котором перечислены все разрешения, которые разрешено делать текущему пользователю.操作.

  • Если текущий идентификатор пользователя равен 32, в разрешениях должно быть три пункта:query_users,change_user,delete_category. Затем внешний интерфейс изменяет массив операций на:
var operations = [
  query_users = true,
  change_user = true,
  delete_category = true
];

Теперь будут отображаться все меню и кнопки.

  • Если текущий идентификатор пользователя равен 13, а идентификатор группы пользователей равен 5, то в разрешениях должен быть один пункт:delete_category. Затем внешний интерфейс изменяет массив операций на:
var operations = [
  query_users = false,
  change_user = false,
  delete_category = true
];

меню сейчас用户管理будет скрыт

2. Метод авторизации 1: предоставить операцию объекту
授权
Метод представления интерфейса:
POST /permissions

3. Способ авторизации 2: Предоставление разрешения на работу с объектом
授权
Метод представления интерфейса:
POST /permissions/key/{key}/value/{value}