Начать работу
Установка
перейдите get github.com/casbin/casbin/v2
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jcasbin</artifactId>
<version>1.x.y</version>
</dependency>
# NPM
npm install casbin --save
# Yarn
yarn add casbin
composer.json
вашего проекта. Это загрузит пакет:
композитор требует casbin/casbin
pip install casbin
dotnet добавить пакет Casbin.NET
cargo install cargo-edit
add casbin
// Если вы используете async-std как async executor
cargo add async-std
// Если вы используете tokio as async executor
cargo add tokio // убедитесь, что вы активировали его функцию `macros`
luarocks установить casbin
Если сообщение ошибка: Ваш пользователь не имеет разрешения на запись в /usr/local/lib/luarocks/rocks -- вы можете запустить как привилегированный пользователь или использовать ваше локальное дерево с --local. вы можете добавить --local за вашей командой, чтобы исправить:
luarocks установить casbin --local
Новый силуэт Касбина
Касбин использует конфигурационные файлы для установки модели контроля доступа.
Он имеет два файла конфигурации: model.conf
и policy.csv
. Среди них model.conf
хранит нашу модель доступа, а policy.csv
хранит конфигурацию разрешения для конкретного пользователя. Использование Касбина очень изысканно. В основном, нам нужна одна главная структура: энсил. При построении этой структуры будут загружены model.conf
и policy.csv
.
Другим словом является новый фортепиатель Касбина, вы должны предоставить модель и адаптер.
Касбин FileAdapter, см. Adapter от более адаптер.
- Используйте файл модели и по умолчанию FileAdapter:
импортируйте "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");
импортировать { newEnforcer } из '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")
используя NetCasbin;
var e = new Enforcer("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") -- Силовик Касбин
- Используйте текст модели с другим адаптером:
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
# Use SQLAlchemy Casbin adapter with SQLLite DB
adapter = casbin_sqlalchemy_adapter.Adapter('sqlite:///test.db')
# Create a config model policy
with open("rbac_example_model.conf", "w") as f:
f.write("""
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
""")
# Create enforcer from adapter and config policy
e = casbin.Enforcer('rbac_example_model.conf', adapter)
Проверить права доступа
Добавьте принудительный крючок в ваш код прямо перед тем, как доступ будет сработать:
sub := "alice" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.
ok, err := e.Enforce(sub, obj, act)
if err != nil {
// handle err
}
if ok == true {
// permit alice to read data1
} else {
// deny the request, show an error
}
// You could use BatchEnforce() to enforce some requests in batches.
// This method returns a bool slice, and this slice's index corresponds to the row index of the two-dimensional array.
// e.g. results[0] is the result of {"alice", "data1", "read"}
results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
String sub = "alice"; // the user that wants to access a resource.
String obj = "data1"; // the resource that is going to be accessed.
String act = "read"; // the operation that the user performs on the resource.
if (e.enforce(sub, obj, act) == true) {
// permit alice to read data1
} else {
// deny the request, show an error
}
const sub = 'alice'; // the user that wants to access a resource.
const obj = 'data1'; // the resource that is going to be accessed.
const act = 'read'; // the operation that the user performs on the resource.
if ((await e.enforce(sub, obj, act)) === true) {
// permit alice to read data1
} else {
// deny the request, show an error
}
$sub = "alice"; // the user that wants to access a resource.
$obj = "data1"; // the resource that is going to be accessed.
$act = "read"; // the operation that the user performs on the resource.
if ($e->enforce($sub, $obj, $act) === true) {
// permit alice to read data1
} else {
// deny the request, show an error
}
sub = "alice" # the user that wants to access a resource.
obj = "data1" # the resource that is going to be accessed.
act = "read" # the operation that the user performs on the resource.
if e.enforce(sub, obj, act):
# permit alice to read data1
pass
else:
# deny the request, show an error
pass
var sub = "alice"; # the user that wants to access a resource.
var obj = "data1"; # the resource that is going to be accessed.
var act = "read"; # the operation that the user performs on the resource.
if (await e.EnforceAsync(sub, obj, act))
{
// permit alice to read data1
}
else
{
// deny the request, show an error
}
if casbin.enforce(['alice,data1,read']) then
// Alice is super happy as she can read data1
else
// Alice is sad
let sub = "alice"; // the user that wants to access a resource.
let obj = "data1"; // the resource that is going to be accessed.
let act = "read"; // the operation that the user performs on the resource.
if e.enforce((sub, obj, act)).await? {
// permit alice to read data1
} else {
// error occurs
}
if e:enforce("alice", "data1", "read") then
-- permit alice to read data1
else
-- deny the request, show an error
end
Касбин также предоставляет API для управления разрешениями во время выполнения. Например, вы можете получить все роли, назначенные пользователю как ниже:
roles, err := e.GetRolesForUser("alice")
Roles 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 для большего использования.
Для более широкого использования ознакомьтесь с тестовыми примерами.