1 个稳定版本
1.2.0 | 2024年4月26日 |
---|
#1341 在 数据库接口 中
84KB
1K SLoC
sqlx-adapter
sqlx-adapter 是 Sqlx 的 casbin-rs 适配器。使用此库,Casbin 可以从 Sqlx 支持的数据库中加载策略,或将策略保存到其中,完全支持异步操作。
基于 Sqlx,当前支持的数据库有
注意
为了统一 Casbin 生态系统中的数据库表名,我们决定从版本 0.4.0
开始使用 casbin_rule
而不是 casbin_rules
。如果您正在生产环境中使用旧的 sqlx-adapter
版本,请使用以下命令并更新 sqlx-adapter
版本
# MySQL & PostgreSQL & SQLite
ALTER TABLE casbin_rules RENAME TO casbin_rule;
安装
将以下内容添加到 Cargo.toml
对于 MySQL
sqlx-adapter = { version = "1.2.0", default-features = false, features = ["mysql", "runtime-tokio-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
对于 PostgreSQL
sqlx-adapter = { version = "1.2.0", default-features = false, features = ["postgres", "runtime-tokio-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
对于 SQLite
sqlx-adapter = { version = "1.2.0", default-features = false, features = ["sqlite", "runtime-tokio-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
警告:从 sqlx-adapter v0.4.0
开始,支持 tokio v1.0
或更高版本,我们建议您升级相关组件以确保其正常运行。最后一个支持 tokio v0.2
的版本是 sqlx-adapter v0.3.0
,您可以根据需要选择。
配置
-
设置数据库环境
您必须准备数据库环境,以便
Sqlx
在编译时可以对查询进行静态检查。一种方便的选项是使用 docker 来准备您的数据库环境#!/bin/bash DIS=$(lsb_release -is) command -v docker > /dev/null 2>&1 || { echo "Please install docker before running this script." && exit 1; } if [ $DIS == "Ubuntu" ] || [ $DIS == "LinuxMint" ]; then sudo apt install -y \ libpq-dev \ libmysqlclient-dev \ postgresql-client \ mysql-client-core; elif [ $DIS == "Deepin" ]; then sudo apt install -y \ libpq-dev \ libmysql++-dev \ mysql-client \ postgresql-client; elif [ $DIS == "ArchLinux" ] || [ $DIS == "ManjaroLinux" ]; then sudo pacman -S libmysqlclient \ postgresql-libs \ mysql-clients \; else echo "Unsupported system: $DIS" && exit 1; fi docker run -itd \ --restart always \ -e POSTGRES_USER=casbin_rs \ -e POSTGRES_PASSWORD=casbin_rs \ -e POSTGRES_DB=casbin \ -p 5432:5432 \ -v /srv/docker/postgresql:/var/lib/postgresql \ postgres:11; docker run -itd \ --restart always \ -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \ -e MYSQL_USER=casbin_rs \ -e MYSQL_PASSWORD=casbin_rs \ -e MYSQL_DATABASE=casbin \ -p 3306:3306 \ -v /srv/docker/mysql:/var/lib/mysql \ mysql:8 \ --default-authentication-plugin=mysql_native_password;
-
创建表
casbin_rule
# PostgreSQL psql postgres://casbin_rs:[email protected]:5432/casbin -c "CREATE TABLE IF NOT EXISTS casbin_rule ( id SERIAL PRIMARY KEY, ptype VARCHAR NOT NULL, v0 VARCHAR NOT NULL, v1 VARCHAR NOT NULL, v2 VARCHAR NOT NULL, v3 VARCHAR NOT NULL, v4 VARCHAR NOT NULL, v5 VARCHAR NOT NULL, CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5) );" # MySQL mysql -h 127.0.0.1 -u casbin_rs -pcasbin_rs casbin CREATE TABLE IF NOT EXISTS casbin_rule ( id INT NOT NULL AUTO_INCREMENT, ptype VARCHAR(12) NOT NULL, v0 VARCHAR(128) NOT NULL, v1 VARCHAR(128) NOT NULL, v2 VARCHAR(128) NOT NULL, v3 VARCHAR(128) NOT NULL, v4 VARCHAR(128) NOT NULL, v5 VARCHAR(128) NOT NULL, PRIMARY KEY(id), CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # SQLite touch casbin.db sqlite3 casbin.db -cmd "CREATE TABLE IF NOT EXISTS casbin_rule ( id INTEGER PRIMARY KEY, ptype VARCHAR(12) NOT NULL, v0 VARCHAR(128) NOT NULL, v1 VARCHAR(128) NOT NULL, v2 VARCHAR(128) NOT NULL, v3 VARCHAR(128) NOT NULL, v4 VARCHAR(128) NOT NULL, v5 VARCHAR(128) NOT NULL, CONSTRAINT unique_key_diesel_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5) );"
-
配置
env
将
sample.env
重命名为.env
并将DATABASE_URL
,POOL_SIZE
放在里面DATABASE_URL=postgres://casbin_rs:casbin_rs@localhost:5432/casbin # DATABASE_URL=mysql://casbin_rs:casbin_rs@localhost:3306/casbin # DATABASE_URL=sqlite:casbin.db POOL_SIZE=8
或者您可以导出
DATABASE_URL
,POOL_SIZE
export DATABASE_URL=postgres://casbin_rs:casbin_rs@localhost:5432/casbin export POOL_SIZE=8
示例
use sqlx_adapter::casbin::prelude::*;
use sqlx_adapter::casbin::Result;
use sqlx_adapter::SqlxAdapter;
#[tokio::main]
async fn main() -> Result<()> {
let m = DefaultModel::from_file("examples/rbac_model.conf").await?;
let a = SqlxAdapter::new("postgres://casbin_rs:[email protected]:5432/casbin", 8).await?;
let mut e = Enforcer::new(m, a).await?;
Ok(())
}
特性
postgres
mysql
sqlite
注意:postgres
、mysql
、sqlite
互斥,这意味着您只能激活其中一个。
依赖项
~28–44MB
~817K SLoC