17个版本 (3个稳定版)
1.2.0 | 2024年2月21日 |
---|---|
0.4.2 | 2021年8月19日 |
0.4.1 | 2021年2月5日 |
0.3.0 | 2020年9月27日 |
0.2.6 | 2020年7月18日 |
#84 在 数据库接口
每月928次下载
68KB
1.5K 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"] }
警告:tokio v1.0
或更高版本从sqlx-adapter v0.4.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
互相排斥,这意味着您只能激活它们中的一个。
依赖项
~16–36MB
~549K SLoC