use casbin::{CoreApi, DefaultModel, Enforcer, MgmtApi};
use surreal_casbin_adapter::SurrealAdapter;
use surrealdb::engine::any::connect;
use surrealdb::opt::auth::Root;
const MODEL: &str = r#"
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
"#;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = connect("ws://localhost:8000").await?;
db.signin(Root {
username: "root".to_string(),
password: "secret".to_string(),
})
.await?;
db.use_ns("test").use_db("test").await?;
let adapter = SurrealAdapter::new(db);
adapter.create_table().await?;
let model = DefaultModel::from_str(MODEL).await?;
let mut enforcer = Enforcer::new(model, adapter).await?;
enforcer
.add_policy(vec![
"reader".to_string(),
"data".to_string(),
"read".to_string(),
])
.await?;
enforcer
.add_named_grouping_policies("g", vec![vec!["alice".to_string(), "reader".to_string()]])
.await?;
Ok(())
}