sqlx-adapter

Crates.io Docs CI codecov

Sqlx Adapter is the Sqlx adapter for Casbin-rs. With this library, Casbin can load policy from Sqlx supported database or save policy to it with fully asynchronous support.

Based on Sqlx, The current supported databases are:

Notice

In order to unify the database table name in Casbin ecosystem, we decide to use casbin_rule instead of casbin_rules from version 0.4.0. If you are using old version sqlx-adapter in your production environment, please use following command and update sqlx-adapter version:

````SQL

MySQL & PostgreSQL & SQLite

ALTER TABLE casbinrules RENAME TO casbinrule; ````

Install

Add it to Cargo.toml

rust sqlx-adapter = { version = "0.4.1, features = ["postgres"] } tokio = "1.1.1"

Warning: tokio v1.0 or later is supported from sqlx-adapter v0.4.0, we recommend that you upgrade the relevant components to ensure that they work properly. The last version that supports tokio v0.2 is sqlx-adapter v0.3.0 , you can choose according to your needs.

Configure

  1. Set up database environment

    You must prepare the database environment so that Sqlx can do static check with queries during compile time. One convenient option is using docker to get your database environment ready:

    ```bash

    !/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 POSTGRESUSER=casbinrs \ -e POSTGRESPASSWORD=casbinrs \ -e POSTGRES_DB=casbin \ -p 5432:5432 \ -v /srv/docker/postgresql:/var/lib/postgresql \ postgres:11;

    docker run -itd \ --restart always \ -e MYSQLALLOWEMPTYPASSWORD=yes \ -e MYSQLUSER=casbinrs \ -e MYSQLPASSWORD=casbinrs \ -e MYSQLDATABASE=casbin \ -p 3306:3306 \ -v /srv/docker/mysql:/var/lib/mysql \ mysql:8 \ --default-authentication-plugin=mysqlnativepassword;

    ```

  2. Create table casbin_rule

    ```bash

    PostgreSQL

    psql postgres://casbinrs:casbinrs@127.0.0.1:5432/casbin -c "CREATE TABLE IF NOT EXISTS casbinrule ( 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 uniquekeysqlxadapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5) );"

    MySQL

    mysql -h 127.0.0.1 -u casbinrs -pcasbinrs casbin

    CREATE TABLE IF NOT EXISTS casbinrule ( id INT NOT NULL AUTOINCREMENT, 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 uniquekeysqlx_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 casbinrule ( 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 uniquekeydieseladapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5) );" ```

  3. Configure env

    Rename sample.env to .env and put DATABASE_URL, POOL_SIZE inside

    ```bash DATABASEURL=postgres://casbinrs:casbin_rs@localhost:5432/casbin

    DATABASEURL=mysql://casbinrs:casbin_rs@localhost:3306/casbin

    DATABASE_URL=sqlite:casbin.db

    POOL_SIZE=8 ```

    Or you can export DATABASE_URL, POOL_SIZE

    bash export DATABASE_URL=postgres://casbin_rs:casbin_rs@localhost:5432/casbin export POOL_SIZE=8

Example

```rust use sqlxadapter::casbin::prelude::*; use sqlxadapter::casbin::Result; use sqlx_adapter::SqlxAdapter;

[tokio::main]

async fn main() -> Result<()> { let m = DefaultModel::fromfile("examples/rbacmodel.conf").await?;

let a = SqlxAdapter::new("postgres://casbin_rs:casbin_rs@127.0.0.1:5432/casbin", 8).await?;
let mut e = Enforcer::new(m, a).await?;

Ok(())

}

```

Features

Attention: postgres, mysql, sqlite are mutual exclusive which means that you can only activate one of them.