1 个稳定版本

1.2.0 2024年4月26日

#1341数据库接口

Apache-2.0

84KB
1K SLoC

sqlx-adapter

Crates.io Docs CI codecov

sqlx-adapter 是 Sqlxcasbin-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,您可以根据需要选择。

配置

  1. 设置数据库环境

    您必须准备数据库环境,以便 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;
    
    
  2. 创建表 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)
       );"
    
  3. 配置 env

    sample.env 重命名为 .env 并将 DATABASE_URLPOOL_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_URLPOOL_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

注意postgresmysqlsqlite 互斥,这意味着您只能激活其中一个。

依赖项

~28–44MB
~817K SLoC