use actix_web::{web, App, HttpResponse, HttpServer};
use role_system::{RoleSystem, Role, Permission, Subject, Resource};
struct AppState {
role_system: RoleSystem,
}
async fn check_access(
state: web::Data<AppState>,
path: web::Path<(String, String)>,
) -> HttpResponse {
let (user_id, resource_id) = path.into_inner();
let subject = Subject::new(&user_id);
let resource = Resource::new(&resource_id, "documents");
match state.role_system.check_permission(&subject, "read", &resource) {
Ok(true) => HttpResponse::Ok().body("Access granted"),
Ok(false) => HttpResponse::Forbidden().body("Access denied"),
Err(_) => HttpResponse::InternalServerError().finish(),
}
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let mut role_system = RoleSystem::new();
let reader = Role::new("reader")
.add_permission(Permission::new("read", "documents"));
role_system.register_role(reader).unwrap();
let state = web::Data::new(AppState { role_system });
HttpServer::new(move || {
App::new()
.app_data(state.clone())
.route("/access/{user_id}/{resource_id}", web::get().to(check_access))
})
.bind("127.0.0.1:8080")?
.run()
.await
}