Как начать
Установка
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- C++
- Rust
- Delphi
- Lua
go get github.com/casbin/casbin/v2
Maven:
<!-- https://mvnrepository.com/artifact/org.casbin/jcasbin -->
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jcasbin</artifactId>
<version>1.x.y</version>
</dependency>
# NPM
npm install casbin --save
# Yarn
yarn add casbin
PHP. Установите пакет с помощью composer. Команда для установки пакета:
composer require casbin/casbin
pip install casbin
dotnet add package Casbin.NET
# скачать исходный код
git clone https://github.com/casbin/casbin-cpp. он
# генерировать файлы проектов
cd casbin-cpp && mkdir build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release
# build and install casbin
cmake --build . --config Release --target casbin install -j 10
cargo install cargo-edit
add casbin
// Если вы используете async-std как async executor
cargo add async-std
// Если вы используете tokio as async executor
cargo add tokio // убедитесь, что вы активировали его функцию `macros`
Delphi: Casbin4D поставляется в пакете (сейчас для Delphi 10.3 Rio) и вы можете установить его в IDE. Тем не менее, там нет визуальных компонентов, а значит вы не сможете использовать модули независимо от пакетов. Просто импортируйте модули в свой проект (при условии, что вам не важно их количество)
luarocks установить casbin
Если сообщение ошибка: Ваш пользователь не имеет разрешения на запись в /usr/local/lib/luarocks/rocks -- вы можете запустить как привилегированный пользователь или использовать ваше локальное дерево с --local. вы можете добавить --local за вашей командой, чтобы исправить:
luarocks установить casbin --local
Новый силуэт Касбина
Касбин использует конфигурационные файлы для установки модели контроля доступа.
Он имеет два файла конфигурации: model.conf
и policy.csv
. Среди них model.conf
хранит нашу модель доступа, а policy.csv
хранит конфигурацию разрешения для конкретного пользователя. Использование Касбина очень изысканно. В основном, нам нужна одна главная структура: энсил. При построении этой структуры будут загружены model.conf
и policy.csv
.
Другим словом является новый фортепиатель Касбина, вы должны предоставить модель и адаптер.
Casbin has a FileAdapter, see Adapter for more information.
- Используйте файл модели и по умолчанию FileAdapter:
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- C++
- Delphi
- Rust
- Lua
import "github.com/casbin/casbin/v2"
e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
import org.casbin.jcasbin.main.Enforcer;
Enforcer e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
import { newEnforcer } from 'casbin';
const e = await newEnforcer('path/to/model.conf', 'path/to/policy.csv');
require_once './vendor/autoload.php';
use Casbin\Enforcer;
$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
import casbin
e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")
using NetCasbin;
var e = new Enforcer("path/to/model.conf", "path/to/policy.csv");
#include <iostream>
#include <casbin/casbin.h>
int main() {
// Create an Enforcer
casbin::Enforcer e("path/to/model.conf", "path/to/policy.csv");
// ваш код ..
}
var
casbin: ICasbin;
begin
casbin := TCasbin.Create('path/to/model.conf', 'path/to/policy.csv');
...
end
использование казино::prelude::*;
// Если вы используете async_td как исполнитель async
#[cfg(feature = "runtime-async-std")]
#[async_std::main]
async fn main() -> Result<()> {
let mut e = Enforcer::new("path/to/model. onf", "path/to/policy.csv"). Ождите?;
Ok())
}
// Если вы используете tokio as async исполнитель
#[cfg(feature = "runtime-tokio")]
#[tokio:main]
async fn main() -> Result<()> {
let mut e = Enforcer::new("path/to/model. onf", "path/to/policy.csv").await?;
Ok())
}
локальный Силор = require("casbin")
local e = Enforcer:new("path/to/model.conf", "path/to/policy.csv") -- Силовик Касбин
- Используйте текст модели с другим адаптером:
- Go
- Python
import (
"log"
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
xormadapter "github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
)
// Инициализация Xorm адаптера с базой данных MySQL.
a, err := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0. :3306)/casbin")
if err != nil {
log.Fatalf("error: adapter: %s", err)
}
m, err := model. ewModelFromString(`
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p. ft == allow))
[matchers]
м = r.sub == p.sub && r.obj == p. bj && r.act == p.act
`)
if err != nil {
log. atalf("error: model: %s", err)
}
e, err := casbin. ewEnforcer(m, a)
if err != nil {
log.Fatalf("ошибка: enforcer: %s", err)
}
import casbin
import casbin_sqlalchemy_adapter
# Используйте адаптер SQLAlchemy Casbin с SQLLite DB
адаптер = casbin_sqlalchemy_adapter. dapter('sqlite:///test.db')
# Создать политику модели конфигурации
с open("rbac_example_model.conf", "w") как f:
f. rite("""
[request_definition]
r = sub, obj, акт
[policy_definition]
p = sub, obj, действовать
[policy_effect]
e = где-то (стр. f== допустить))
[matchers]
м = r. ub == p.sub && r.obj == p.obj && r.act == p. ct
""")
# Создайте энсилятор из адаптера и политики конфигурации
e = casbin.Enforcer('rbac_example_model.conf', адаптер)
Проверить права доступа
Добавьте вызов энфорсера в свой код там, где необходимо контролировать доступ:
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- C++
- Delphi
- Rust
- Lua
sub := "alice" // пользователь, который хочет получить доступ к ресурсу.
obj := "data1" // ресурс, доступ к которому запрашивается.
act := "read" // действие, которое совершает пользователь над ресурсом.
ok, err := e. nforce(sub, obj, act)
если err ! nil {
// обработка err
}
if ok == true {
// разрешить alice к чтению данных 1
} else {
// отрицаем запрос, показать ошибку
}
// Вы можете использовать BatchEnforce() для применения некоторых запросов в пакетах.
// Этот метод возвращает маску буля, и этот индекс ломтика соответствует индексу строк двухмерного массива.
// например, результаты[0] — это результат {"alice", "data1", "read"}
results, err := e.BatchEnforce([][][]interface{}{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
String sub = "alice"; // пользователь, который хочет получить доступ к ресурсу.
String obj = "data1"; // ресурс, доступ к которому запрашивается.
String act = "read"; // действие, которое совершает пользователь над ресурсом.
if (e. nforce(sub, obj, act) == true) {
// разрешить alice to read data1
} else {
// Отказать в запросе, показать ошибку
}
const sub = 'alice'; // пользователь, который хочет получить доступ к ресурсу.
const obj = 'data1'; // ресурс, доступ к которому запрашивается.
const act = 'read'; // действие, которое совершает пользователь над ресурсом.
if (ждут e. nforce(sub, obj, act)) === true) {
// разрешить alice to read data1
} else {
// Отказать в запросе, показать ошибку
}
$sub = "alice"; // пользователь, который хочет получить доступ к ресурсу.
$obj = "data1"; // ресурс, доступ к которому запрашивается.
$act = "read"; // действие, которое совершает пользователь над ресурсом.
if ($e->enforce($sub, $obj, $act) === true) {
// разрешить alice1 читать (read) ресурс data1
} else {
// запретить, показать ошибку
}
sub = "alice" # пользователь, который хочет получить доступ к ресурсу.
obj = "data1" # ресурс, доступ к которому запрашивается.
act = "read" # действие, которое совершает пользователь над ресурсом.
if e.enforce(sub, obj, act):
# разрешить alice1 читать (read) ресурс data1
pass
else:
# разрешить alice1 читать (read) ресурс data1
pass
var sub = "alice"; # пользователь, который хочет получить доступ к ресурсу.
# ресурс var obj = "data1".
var act = "read"; # операция, выполняемая пользователем на ресурсе.
if (ожидание e. nforceAsync(sub, obj, act))
{
// разрешить alice to read data1
}
else
{
// Отклонить запрос, показать ошибку
}
casbin::Enforcer e("../assets/model.conf", "../assets/policy.csv");
if (e. nforce({"alice", "/alice_data/hello", "GET"})) {
std::cout << "Enforce OK" << std::endl;
} else {
std::cout << "Enforce NOT Good" << std::endl;
}
if (e. nforce({"alice", "/alice_data/hello", "POST"})) {
std::cout << "Enforce OK" << std::endl;
} else {
std::cout << "Enforce NOT Good" << std::endl;
}
if casbin.enforce(['alice,data1,read']) then
// Alice супер счастлива, потому что она может читать data1
else
// Alice растроена
let sub = "alice"; // пользователь, который хочет получить доступ к ресурсу.
let obj = "data1"; // ресурс, к которому будет доступ.
let act = "read"; // операция, выполняемая пользователем на ресурсе.
if e.enforce(sub, obj, act)).await? {
// разрешить alice to read data1
} else {
// ошибка
}
если e:enforce("alice", "data1", "read") затем
-- разрешить alice to read data1
else
-- отклонить запрос, показать ошибку
конца
Касбин также предоставляет API для управления разрешениями во время выполнения. Например, вы можете получить все роли, назначенные пользователю как ниже:
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- Delphi
- Rust
- Lua
roles, err := e.GetRolesForUser("alice")
List<String> roles = e.getRolesForUser("alice");
const roles = await e.getRolesForUser('alice');
$roles = $e->getRolesForUser("alice");
roles = e.get_roles_for_user("alice")
var roles = e.GetRolesForUser("alice");
roles = e.rolesForEntity("alice")
let roles = e.get_roles_for_user("alice");
local roles = e:GetRolesForUser("alice")
Смотрите Management API и RBAC API для большего использования.
Вы можете посмотреть на тест кейсы, чтобы увидеть больше примеров использования.