# ๐ beep-authz
**A Rust authorization library with SpiceDB integration for fine-grained permissions.**
[](https://crates.io/crates/beep-authz)
[](https://docs.rs/beep-authz)
[](https://github.com/beep-industries/crates/blob/main/LICENSE)
*Powerful, flexible authorization with Google Zanzibar-inspired permission checks*
## โจ Features
๐ **SpiceDB Integration**
- Native support for SpiceDB/AuthZed
- Fine-grained permission checks
- Relationship-based access control (ReBAC)
โก **High Performance**
- Async/await support with Tokio
- Connection pooling
- gRPC-based communication
๐ฏ **Type-Safe Permissions**
- Strongly-typed permission system
- Object-based resource modeling
- Compile-time safety
๐ก๏ธ **Enterprise Ready**
- Production-tested
- Comprehensive error handling
- Token-based authentication
## ๐ Quick Start
### Installation
Add `beep-authz` to your `Cargo.toml`:
```toml
[dependencies]
beep-authz = "0.1.0"
tokio = { version = "1.48", features = ["full"] }
```
### Basic Usage
```rust
use authz::{SpiceDbRepository, SpiceDbConfig, SpiceDbObject, Permissions};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// ๐ง Configure SpiceDB connection
let config = SpiceDbConfig {
endpoint: "localhost:50051".to_string(),
token: Some("your-preshared-key".to_string()),
};
// ๐ Connect to SpiceDB
let authz = SpiceDbRepository::new(config).await?;
// ๐ Check if user can view a channel
let result = authz.check_permissions(
SpiceDbObject::Channel("channel-123".to_string()),
Permissions::ViewChannels,
SpiceDbObject::User("user-456".to_string()),
).await;
if result.has_permissions() {
println!("โ
User has permission to view channel");
} else {
println!("โ Access denied");
}
Ok(())
}
```
## ๐ Supported Permissions
The library includes built-in permissions for common scenarios:
- **Administrator** - Full access to all resources
- **ManageServer** - Update server settings
- **ManageRoles** - Create and manage roles
- **CreateInvitation** - Generate invite links
- **ManageChannels** - Full channel management
- **ManageWebhooks** - Webhook CRUD operations
- **ViewChannels** - Read channel contents
- **SendMessages** - Post messages
- **ManageNicknames** - Update user nicknames
- **ChangeNickname** - Update own nickname
- **ManageMessages** - Moderate messages
- **AttachFiles** - Upload files
## ๐๏ธ Architecture
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SpiceDbRepository โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ check_permissions() โ โ
โ โ check_permissions_raw() โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โ gRPC
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SpiceDB Server โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Permission Engine โ โ
โ โ โข Check relationships โ โ
โ โ โข Evaluate permissions โ โ
โ โ โข Return authorization result โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
## ๐ง Configuration
Configure SpiceDB connection via environment variables or command-line arguments:
```bash
# Environment variables
export SPICEDB_ENDPOINT="grpc.authzed.com:443"
export SPICEDB_TOKEN="your-preshared-key"
# Or use command-line arguments
cargo run -- --spicedb-endpoint localhost:50051 --spicedb-token your-key
```
## ๐ SpiceDB Setup
This library works with:
- [SpiceDB](https://github.com/authzed/spicedb) - Open-source authorization system
- [AuthZed](https://authzed.com/) - Managed SpiceDB service
## ๐ Learn More
- [SpiceDB Documentation](https://authzed.com/docs)
- [Zanzibar Paper](https://research.google/pubs/pub48190/) - Google's authorization system
- [Permission System Design](https://authzed.com/blog/what-is-rebac)
## ๐งช Testing
Run the test suite:
```bash
cargo test
```
## ๐ License
Licensed under Apache License 2.0. See [LICENSE](../../LICENSE) for details.