| # Secure Role-Based Access Control (RBAC) |
|
|
| ### Overview |
|
|
| This module acts as the service layer for managing user permissions and roles. It is a critical component of a secure application, ensuring that users can only access the resources they are authorized for. |
|
|
| The module is a prime example of building a robust logical layer on a solid foundation. It utilizes the secure database connection provided by `postgresql.py` to handle all interactions with the database, guaranteeing that every query is executed safely and correctly without exposing the underlying security logic. |
|
|
| ----- |
|
|
| ### Core Concepts: The RBAC Model |
|
|
| This module implements a standard Role-Based Access Control model with the following components: |
|
|
| - **Users:** Application users with unique IDs. |
| - **Permissions:** Granular rights or actions a user can perform (e.g., `create_post`, `edit_profile`). |
| - **Roles:** Collections of permissions (e.g., `admin`, `editor`, `viewer`). |
| - **Assignments:** Roles are assigned to users, granting them all the permissions associated with that role. |
|
|
| ----- |
|
|
| ### Dependencies |
|
|
| This module is built on your project's existing `fundaments`: |
|
|
| - `postgresql.py`: The secure database connection module. |
| - `asyncpg`: The asynchronous PostgreSQL driver. |
|
|
| ----- |
|
|
| ### Usage |
|
|
| The `AccessControl` class is designed to be instantiated for a specific user, making it simple to check their permissions. |
|
|
| #### 1\. **Initialization** |
|
|
| The class is initialized with a user's ID. |
|
|
| ```python |
| from fundaments.access_control import AccessControl |
| |
| # Assume a user with ID 1 exists |
| user_id = 1 |
| access_control = AccessControl(user_id) |
| ``` |
|
|
| #### 2\. **Checking Permissions** |
|
|
| The `has_permission` method checks if the user has a specific permission. |
|
|
| ```python |
| # Check if the user has the 'create_post' permission |
| can_create_post = await access_control.has_permission('create_post') |
| |
| if can_create_post: |
| print("User is authorized to create a new post.") |
| else: |
| print("Permission denied.") |
| ``` |
|
|
| #### 3\. **Retrieving User Information** |
|
|
| You can easily fetch a list of a user's roles or permissions. |
|
|
| ```python |
| # Get all roles assigned to the user |
| user_roles = await access_control.get_user_roles() |
| print(f"User's roles: {user_roles}") |
| |
| # Get all permissions for the user |
| user_permissions = await access_control.get_user_permissions() |
| print(f"User's permissions: {user_permissions}") |
| ``` |
|
|
| #### 4\. **Administrative Functions** |
|
|
| The module also includes methods for managing roles and permissions (e.g., in an admin panel). |
|
|
| ```python |
| # Create a new role |
| new_role_id = await access_control.create_role( |
| name='moderator', |
| description='Manages posts and comments.' |
| ) |
| |
| # Assign a role to the user |
| await access_control.assign_role(new_role_id) |
| |
| # Get permissions for a specific role |
| moderator_permissions = await access_control.get_role_permissions(new_role_id) |
| ``` |
|
|
| ----- |
|
|
| ### Database Schema (Required) |
|
|
| The module's functionality relies on the following relational schema: |
|
|
| - `user_roles`: Stores all available roles (`id`, `name`, `description`). |
| - `user_permissions`: Stores all available permissions (`id`, `name`, `description`). |
| - `user_role_assignments`: A junction table linking `user_id` to `role_id`. |
| - `role_permissions`: A junction table linking `role_id` to `permission_id`. |
|
|
| ----- |
|
|
| ### Security & Architecture |
|
|
| - **Secure by Design:** This module never executes raw, unsanitized SQL. Every database operation is channeled through the secure `db.execute_secured_query` function, inheriting its protection against SQL injection and other vulnerabilities. |
| - **Separation of Concerns:** It successfully separates the business logic of access control from the low-level concerns of database security, making the entire application more robust and easier to maintain. |
| - **Extensibility:** New access control methods can be added easily by following the established pattern of using the underlying `db` module. |
|
|
| This `access_control.py` is a prime example of a secure, modular, and extensible building block for your application's architecture. |
|
|