feat: export Connection type and document with_pool() constructor for sharing existing db pool Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
Diesel Adapter is the Diesel adapter for Casbin-RS. With this library, Casbin can load policy from Diesel supported database or save policy to it.
Based on Diesel, The current supported databases are:
Attention: postgres, mysql, sqlite are mutual exclusive which means that you can only activate one of them.
In order to unify the database table name in Casbin ecosystem, we decide to use casbin_rule instead of casbin_rules from version 0.9.0. If you are using old version diesel-adapter in your production environment, please use following command and update diesel-adapter version:
# MySQL & PostgreSQL & SQLite ALTER TABLE casbin_rules RENAME TO casbin_rule;
Add it to Cargo.toml
diesel-adapter = { version = "1.2.0", features = ["postgres"] }
tokio = { version = "1.1.1", features = ["macros", "rt-multi-thread"] }
Warning: tokio v1.0 or later is supported from diesel-adapter v0.9.0, we recommend that you upgrade the relevant components to ensure that they work properly. The last version that supports tokio v0.2 is diesel-adapter v0.8.3 , you can choose according to your needs.
Configure env
Rename sample.env to .env and put DATABASE_URL, POOL_SIZE inside
DATABASE_URL=postgres://casbin_rs:casbin_rs@localhost:5432/casbin # DATABASE_URL=mysql://casbin_rs:casbin_rs@localhost:3306/casbin # DATABASE_URL=casbin.db POOL_SIZE=8
Or you can export DATABASE_URL, POOL_SIZE
export DATABASE_URL=postgres://casbin_rs:casbin_rs@localhost:5432/casbin export POOL_SIZE=8
new() with a connection stringuse diesel_adapter::casbin::prelude::*; use diesel_adapter::DieselAdapter; #[tokio::main] async fn main() -> Result<()> { let mut m = DefaultModel::from_file("examples/rbac_model.conf").await?; let a = DieselAdapter::new("postgres://casbin_rs:casbin_rs@127.0.0.1:5432/casbin", 8)?; let mut e = Enforcer::new(m, a).await?; Ok(()) }
with_pool() with an existing connection poolIf your application already manages a connection pool, you can share it with the Casbin enforcer using with_pool():
use diesel::r2d2::{ConnectionManager, Pool}; use diesel_adapter::{casbin::prelude::*, Connection, DieselAdapter}; #[tokio::main] async fn main() -> Result<()> { // Build (or reuse) your application's existing pool. // DATABASE_URL can be e.g. "postgres://user:pass@localhost:5432/mydb" let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); let manager = ConnectionManager::<Connection>::new(database_url); let pool = Pool::builder().max_size(8).build(manager).unwrap(); let mut m = DefaultModel::from_file("examples/rbac_model.conf").await?; let a = DieselAdapter::with_pool(pool)?; let mut e = Enforcer::new(m, a).await?; Ok(()) }