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数据库接口

Download history 32/week @ 2024-04-22 8/week @ 2024-04-29 22/week @ 2024-05-06 16/week @ 2024-05-13 24/week @ 2024-05-20 10/week @ 2024-05-27 2/week @ 2024-06-03 11/week @ 2024-06-10 9/week @ 2024-06-17 11/week @ 2024-06-24 19/week @ 2024-07-01 4/week @ 2024-07-08 3/week @ 2024-07-15 193/week @ 2024-07-22 282/week @ 2024-07-29 450/week @ 2024-08-05

每月928次下载

Apache-2.0

68KB
1.5K 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"] }

警告tokio v1.0或更高版本从sqlx-adapter v0.4.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 互相排斥,这意味着您只能激活它们中的一个。

依赖项

~16–36MB
~549K SLoC