Базовая архитектура
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}