c77_rbac/INSTALL.md
2025-05-23 23:29:45 -05:00

770 lines
22 KiB
Markdown

# c77_rbac PostgreSQL Extension - Installation Guide
This comprehensive guide covers all aspects of installing and upgrading the c77_rbac extension, with detailed examples for different scenarios.
## Table of Contents
1. [Prerequisites](#prerequisites)
2. [Installation Overview](#installation-overview)
3. [Fresh Installation (Version 1.1)](#fresh-installation-version-11)
4. [Upgrading from Version 1.0](#upgrading-from-version-10)
5. [Post-Installation Verification](#post-installation-verification)
6. [Initial Configuration](#initial-configuration)
7. [Troubleshooting Installation Issues](#troubleshooting-installation-issues)
8. [Uninstallation](#uninstallation)
9. [Production Deployment Checklist](#production-deployment-checklist)
## Prerequisites
### System Requirements
- **PostgreSQL**: Version 14 or later
- **Operating System**: Linux (Ubuntu, CentOS, RHEL, Debian), macOS, or Windows
- **Privileges**: PostgreSQL superuser access for installation
- **Disk Space**: Minimal (< 1MB for extension files)
### Required Access Levels
1. **System Administrator**: Access to copy files to PostgreSQL extension directory
2. **Database Superuser**: To create the extension and grant privileges
3. **Application User**: Regular database user for your application
### Identify Your PostgreSQL Version and Paths
```bash
# Check PostgreSQL version
psql --version
# or
sudo -u postgres psql -c "SELECT version();"
# Find PostgreSQL installation directory
pg_config --sharedir
# Example output: /usr/share/postgresql/14
# Find extension directory
pg_config --sharedir
# Extension directory will be: /usr/share/postgresql/14/extension/
```
## Installation Overview
### File Structure
The c77_rbac extension consists of these files:
```
c77_rbac.control # Extension metadata (version, dependencies)
c77_rbac--1.1.sql # Fresh installation SQL script
c77_rbac--1.0--1.1.sql # Upgrade script (1.0 → 1.1)
```
### Installation Paths
Choose the appropriate installation method:
- **Fresh Installation**: Use `c77_rbac--1.1.sql` directly
- **Upgrade from 1.0**: Use `c77_rbac--1.0--1.1.sql` upgrade script
## Fresh Installation (Version 1.1)
### Step 1: Download and Prepare Files
Download the extension files to a temporary directory:
```bash
# Create temporary directory
mkdir ~/c77_rbac_install
cd ~/c77_rbac_install
# Download files (replace with your actual download method)
wget https://github.com/yourusername/c77_rbac/releases/download/v1.1/c77_rbac.control
wget https://github.com/yourusername/c77_rbac/releases/download/v1.1/c77_rbac--1.1.sql
# Verify files downloaded
ls -la
# Should show:
# c77_rbac.control
# c77_rbac--1.1.sql
```
### Step 2: Copy Files to PostgreSQL Extension Directory
**For Ubuntu/Debian:**
```bash
# Find the correct PostgreSQL version directory
PG_VERSION=$(pg_config --version | sed 's/PostgreSQL \([0-9]\+\).*/\1/')
echo "PostgreSQL version: $PG_VERSION"
# Copy files (requires sudo)
sudo cp c77_rbac.control /usr/share/postgresql/$PG_VERSION/extension/
sudo cp c77_rbac--1.1.sql /usr/share/postgresql/$PG_VERSION/extension/
# Verify files copied correctly
ls -la /usr/share/postgresql/$PG_VERSION/extension/c77_rbac*
```
**For CentOS/RHEL/Rocky Linux:**
```bash
# Find PostgreSQL version
PG_VERSION=$(pg_config --version | sed 's/PostgreSQL \([0-9]\+\).*/\1/')
# Copy files
sudo cp c77_rbac.control /usr/pgsql-$PG_VERSION/share/extension/
sudo cp c77_rbac--1.1.sql /usr/pgsql-$PG_VERSION/share/extension/
# Verify
ls -la /usr/pgsql-$PG_VERSION/share/extension/c77_rbac*
```
**For macOS (with Homebrew):**
```bash
# Find Homebrew PostgreSQL path
PG_CONFIG_PATH=$(which pg_config)
PG_SHARE_DIR=$(pg_config --sharedir)
# Copy files
sudo cp c77_rbac.control $PG_SHARE_DIR/extension/
sudo cp c77_rbac--1.1.sql $PG_SHARE_DIR/extension/
# Verify
ls -la $PG_SHARE_DIR/extension/c77_rbac*
```
### Step 3: Create Database and Users
Connect as PostgreSQL superuser:
```bash
# Connect as postgres superuser
sudo -u postgres psql
```
Create your application database and users:
```sql
-- Create application database
CREATE DATABASE myapp_production;
-- Create application user with secure password
CREATE USER myapp_user WITH
PASSWORD 'your_very_secure_password_here'
NOSUPERUSER
NOCREATEDB
NOCREATEROLE;
-- Optional: Create read-only user for reporting
CREATE USER myapp_readonly WITH
PASSWORD 'readonly_secure_password'
NOSUPERUSER
NOCREATEDB
NOCREATEROLE;
-- List databases to verify
\l
```
### Step 4: Install the Extension
Connect to your application database:
```sql
-- Connect to your database
\c myapp_production
```
Install the c77_rbac extension:
```sql
-- Install extension (this creates all tables, functions, views)
CREATE EXTENSION c77_rbac;
-- Verify installation
SELECT extname, extversion FROM pg_extension WHERE extname = 'c77_rbac';
-- Should show: c77_rbac | 1.1
```
### Step 5: Grant Privileges to Application User
Grant necessary privileges to your application user:
```sql
-- Grant database-level privileges
GRANT CONNECT ON DATABASE myapp_production TO myapp_user;
GRANT CREATE ON DATABASE myapp_production TO myapp_user;
-- Grant schema usage
GRANT USAGE ON SCHEMA public TO myapp_user;
-- Grant table privileges (read-only, modifications through functions)
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myapp_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO myapp_user;
-- Grant function execution privileges
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO myapp_user;
-- Set default privileges for future objects
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO myapp_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT EXECUTE ON FUNCTIONS TO myapp_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO myapp_user;
-- For readonly user (optional)
GRANT CONNECT ON DATABASE myapp_production TO myapp_readonly;
GRANT USAGE ON SCHEMA public TO myapp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myapp_readonly;
GRANT SELECT ON public.c77_rbac_user_permissions TO myapp_readonly;
GRANT SELECT ON public.c77_rbac_summary TO myapp_readonly;
```
### Step 6: Verify Installation
Test the installation:
```sql
-- Check extension is installed
SELECT extname, extversion, extrelocatable FROM pg_extension WHERE extname = 'c77_rbac';
-- Check tables were created
\dt public.c77_rbac_*
-- Check functions were created
\df public.c77_rbac_*
-- Check views were created
\dv public.c77_rbac_*
-- Test basic functionality
SELECT public.c77_rbac_grant_feature('test_role', 'test_feature');
SELECT public.c77_rbac_assign_subject('test_user', 'test_role', 'global', 'all');
SELECT public.c77_rbac_can_access('test_feature', 'test_user', 'global', 'all');
-- Should return: true
-- Clean up test data
SELECT public.c77_rbac_revoke_subject_role('test_user', 'test_role', 'global', 'all');
SELECT public.c77_rbac_revoke_feature('test_role', 'test_feature');
```
## Upgrading from Version 1.0
### Pre-Upgrade Checklist
1. **Backup your database:**
```bash
pg_dump -U postgres -h localhost myapp_production > backup_before_upgrade.sql
```
2. **Verify current version:**
```sql
SELECT extname, extversion FROM pg_extension WHERE extname = 'c77_rbac';
-- Should show: c77_rbac | 1.0
```
3. **Check for dependencies:**
```sql
SELECT * FROM public.c77_rbac_show_dependencies();
```
### Step 1: Download Upgrade Files
```bash
# Create upgrade directory
mkdir ~/c77_rbac_upgrade
cd ~/c77_rbac_upgrade
# Download upgrade files
wget https://github.com/yourusername/c77_rbac/releases/download/v1.1/c77_rbac.control
wget https://github.com/yourusername/c77_rbac/releases/download/v1.1/c77_rbac--1.0--1.1.sql
# Optional: Download full 1.1 script for reference
wget https://github.com/yourusername/c77_rbac/releases/download/v1.1/c77_rbac--1.1.sql
```
### Step 2: Copy Upgrade Files
```bash
# Find PostgreSQL directory
PG_VERSION=$(pg_config --version | sed 's/PostgreSQL \([0-9]\+\).*/\1/')
# Copy files (Ubuntu/Debian)
sudo cp c77_rbac.control /usr/share/postgresql/$PG_VERSION/extension/
sudo cp c77_rbac--1.0--1.1.sql /usr/share/postgresql/$PG_VERSION/extension/
# For CentOS/RHEL, use:
# sudo cp c77_rbac.control /usr/pgsql-$PG_VERSION/share/extension/
# sudo cp c77_rbac--1.0--1.1.sql /usr/pgsql-$PG_VERSION/share/extension/
# Verify files
ls -la /usr/share/postgresql/$PG_VERSION/extension/c77_rbac*
# Should show:
# c77_rbac.control
# c77_rbac--1.0.sql (existing)
# c77_rbac--1.0--1.1.sql (new)
```
### Step 3: Perform the Upgrade
Connect to your database as superuser:
```bash
sudo -u postgres psql -d myapp_production
```
Execute the upgrade:
```sql
-- Check current version
SELECT extname, extversion FROM pg_extension WHERE extname = 'c77_rbac';
-- Perform upgrade
ALTER EXTENSION c77_rbac UPDATE TO '1.1';
-- Verify upgrade
SELECT extname, extversion FROM pg_extension WHERE extname = 'c77_rbac';
-- Should now show: c77_rbac | 1.1
```
### Step 4: Verify Upgrade Success
Test new functionality:
```sql
-- Test new bulk assignment function
SELECT * FROM public.c77_rbac_bulk_assign_subjects(
ARRAY['user1', 'user2', 'user3'],
'test_role',
'department',
'engineering'
);
-- Test new management views
SELECT * FROM public.c77_rbac_summary;
-- Test new utility functions
SELECT * FROM public.c77_rbac_get_user_roles('user1');
-- Test admin sync function
SELECT public.c77_rbac_sync_admin_features();
-- Clean up test data
SELECT public.c77_rbac_revoke_subject_role('user1', 'test_role', 'department', 'engineering');
SELECT public.c77_rbac_revoke_subject_role('user2', 'test_role', 'department', 'engineering');
SELECT public.c77_rbac_revoke_subject_role('user3', 'test_role', 'department', 'engineering');
```
### Step 5: Update Application Code
After successful upgrade, you can now use new features in your application:
```php
// Laravel example - using new bulk operations
$userIds = ['1001', '1002', '1003', '1004', '1005'];
$results = DB::select("
SELECT * FROM public.c77_rbac_bulk_assign_subjects(?, ?, ?, ?)
", [json_encode($userIds), 'student', 'program', 'dui_education']);
foreach ($results as $result) {
if (!$result->success) {
Log::warning("Failed to assign role to user {$result->external_id}: {$result->error_message}");
}
}
```
## Post-Installation Verification
### Comprehensive Testing Script
Create a test script to verify all functionality:
```sql
-- test_c77_rbac_installation.sql
\echo 'Testing c77_rbac installation...'
-- Test 1: Basic feature granting
\echo 'Test 1: Feature granting'
SELECT public.c77_rbac_grant_feature('admin', 'manage_users');
SELECT public.c77_rbac_grant_feature('manager', 'view_reports');
SELECT public.c77_rbac_grant_feature('employee', 'view_own_data');
-- Test 2: Role assignment
\echo 'Test 2: Role assignment'
SELECT public.c77_rbac_assign_subject('admin_user', 'admin', 'global', 'all');
SELECT public.c77_rbac_assign_subject('dept_manager', 'manager', 'department', 'sales');
SELECT public.c77_rbac_assign_subject('employee_1', 'employee', 'department', 'sales');
-- Test 3: Bulk assignment (v1.1 feature)
\echo 'Test 3: Bulk assignment'
SELECT * FROM public.c77_rbac_bulk_assign_subjects(
ARRAY['emp_1', 'emp_2', 'emp_3'],
'employee',
'department',
'engineering'
);
-- Test 4: Permission checking
\echo 'Test 4: Permission checking'
SELECT public.c77_rbac_can_access('manage_users', 'admin_user', 'global', 'all') as admin_can_manage;
SELECT public.c77_rbac_can_access('view_reports', 'dept_manager', 'department', 'sales') as manager_can_view;
SELECT public.c77_rbac_can_access('manage_users', 'employee_1', 'department', 'sales') as employee_cannot_manage;
-- Test 5: Management views (v1.1 feature)
\echo 'Test 5: Management views'
SELECT * FROM public.c77_rbac_summary;
SELECT * FROM public.c77_rbac_get_user_roles('admin_user');
-- Test 6: Admin sync (v1.1 feature)
\echo 'Test 6: Admin sync'
SELECT public.c77_rbac_sync_admin_features();
-- Test 7: Removal functions (v1.1 feature)
\echo 'Test 7: Removal functions'
SELECT public.c77_rbac_revoke_subject_role('emp_1', 'employee', 'department', 'engineering');
SELECT public.c77_rbac_revoke_feature('employee', 'temporary_feature');
-- Cleanup
\echo 'Cleaning up test data...'
DELETE FROM public.c77_rbac_subject_roles;
DELETE FROM public.c77_rbac_role_features;
DELETE FROM public.c77_rbac_subjects;
DELETE FROM public.c77_rbac_roles;
DELETE FROM public.c77_rbac_features;
\echo 'Installation test complete!'
```
Run the test:
```bash
sudo -u postgres psql -d myapp_production -f test_c77_rbac_installation.sql
```
### Performance Testing
Test with larger datasets:
```sql
-- Performance test script
DO $$
DECLARE
start_time TIMESTAMP;
end_time TIMESTAMP;
i INTEGER;
BEGIN
start_time := clock_timestamp();
-- Create test features
FOR i IN 1..100 LOOP
PERFORM public.c77_rbac_grant_feature('perf_role', 'feature_' || i);
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'Feature creation time: %', end_time - start_time;
start_time := clock_timestamp();
-- Test bulk assignment
PERFORM public.c77_rbac_bulk_assign_subjects(
array_agg('user_' || generate_series),
'perf_role',
'department',
'performance_test'
) FROM generate_series(1, 1000);
end_time := clock_timestamp();
RAISE NOTICE 'Bulk assignment time (1000 users): %', end_time - start_time;
start_time := clock_timestamp();
-- Test permission checking
FOR i IN 1..100 LOOP
PERFORM public.c77_rbac_can_access('feature_1', 'user_' || i, 'department', 'performance_test');
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'Permission check time (100 checks): %', end_time - start_time;
END $$;
```
## Initial Configuration
### Example: Court Education System Setup
After installation, configure for your specific use case:
```sql
-- court_system_setup.sql
-- Step 1: Create court-specific roles and features
SELECT public.c77_rbac_grant_feature('court_admin', 'manage_all_programs');
SELECT public.c77_rbac_grant_feature('court_admin', 'view_all_participants');
SELECT public.c77_rbac_grant_feature('court_admin', 'generate_court_reports');
SELECT public.c77_rbac_grant_feature('court_admin', 'manage_users');
SELECT public.c77_rbac_grant_feature('judge', 'view_court_participants');
SELECT public.c77_rbac_grant_feature('judge', 'approve_completions');
SELECT public.c77_rbac_grant_feature('judge', 'access_court_reports');
SELECT public.c77_rbac_grant_feature('court_clerk', 'enroll_participants');
SELECT public.c77_rbac_grant_feature('court_clerk', 'view_court_participants');
SELECT public.c77_rbac_grant_feature('court_clerk', 'update_participant_info');
SELECT public.c77_rbac_grant_feature('program_coordinator', 'manage_programs');
SELECT public.c77_rbac_grant_feature('program_coordinator', 'view_program_participants');
SELECT public.c77_rbac_grant_feature('program_coordinator', 'update_progress');
SELECT public.c77_rbac_grant_feature('counselor', 'view_assigned_participants');
SELECT public.c77_rbac_grant_feature('counselor', 'update_progress');
SELECT public.c77_rbac_grant_feature('counselor', 'mark_attendance');
SELECT public.c77_rbac_grant_feature('participant', 'view_own_progress');
SELECT public.c77_rbac_grant_feature('participant', 'access_program_materials');
-- Step 2: Sync admin features
SELECT public.c77_rbac_sync_admin_features();
-- Step 3: Assign initial users
-- System administrator
SELECT public.c77_rbac_assign_subject('1', 'court_admin', 'global', 'all');
-- County Superior Court judge
SELECT public.c77_rbac_assign_subject('101', 'judge', 'court', 'county_superior');
-- Court clerk for county superior
SELECT public.c77_rbac_assign_subject('201', 'court_clerk', 'court', 'county_superior');
-- DUI program coordinator
SELECT public.c77_rbac_assign_subject('301', 'program_coordinator', 'program', 'dui_education');
-- Step 4: Apply security policies to tables (after creating your tables)
-- SELECT public.c77_rbac_apply_policy('participants', 'view_court_participants', 'court', 'assigned_court');
-- SELECT public.c77_rbac_apply_policy('participant_progress', 'view_own_progress', 'participant', 'participant_id');
-- SELECT public.c77_rbac_apply_policy('programs', 'manage_programs', 'program', 'program_type');
-- Step 5: Verify setup
SELECT * FROM public.c77_rbac_summary;
```
### Laravel Environment Configuration
Update your `.env` file:
```ini
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=myapp_production
DB_USERNAME=myapp_user
DB_PASSWORD=your_very_secure_password_here
# Optional: Enable query logging for debugging
DB_LOG_QUERIES=true
```
## Troubleshooting Installation Issues
### Common Installation Problems
#### Problem 1: Permission Denied Copying Files
**Error:**
```bash
cp: cannot create regular file '/usr/share/postgresql/14/extension/c77_rbac.control': Permission denied
```
**Solution:**
```bash
# Use sudo for copying files
sudo cp c77_rbac.control /usr/share/postgresql/14/extension/
# Or change to postgres user temporarily
sudo su - postgres
cp /path/to/c77_rbac.control /usr/share/postgresql/14/extension/
exit
```
#### Problem 2: Extension Directory Not Found
**Error:**
```bash
cp: cannot stat '/usr/share/postgresql/14/extension/': No such file or directory
```
**Solution:**
```bash
# Find the correct PostgreSQL installation
pg_config --sharedir
# Or search for extension directories
find /usr -name "extension" -type d 2>/dev/null | grep postgresql
# Common locations:
# Ubuntu/Debian: /usr/share/postgresql/14/extension/
# CentOS/RHEL: /usr/pgsql-14/share/extension/
# macOS Homebrew: /opt/homebrew/share/postgresql@14/extension/
```
#### Problem 3: Extension Creation Fails
**Error:**
```sql
ERROR: could not open extension control file "/usr/share/postgresql/14/extension/c77_rbac.control": No such file or directory
```
**Solution:**
```bash
# Verify files are in correct location
ls -la /usr/share/postgresql/14/extension/c77_rbac*
# Check file permissions
sudo chmod 644 /usr/share/postgresql/14/extension/c77_rbac*
# Restart PostgreSQL if necessary
sudo systemctl restart postgresql
```
#### Problem 4: Upgrade Fails
**Error:**
```sql
ERROR: extension "c77_rbac" has no update path from version "1.0" to version "1.1"
```
**Solution:**
```bash
# Verify upgrade script exists
ls -la /usr/share/postgresql/14/extension/c77_rbac--1.0--1.1.sql
# Check control file has correct version
cat /usr/share/postgresql/14/extension/c77_rbac.control
# Reload configuration
sudo systemctl reload postgresql
```
### Diagnostic Commands
```sql
-- Check extension status
SELECT * FROM pg_extension WHERE extname = 'c77_rbac';
-- Check available versions
SELECT name, version, comment FROM pg_available_extensions WHERE name = 'c77_rbac';
-- Check update paths
SELECT * FROM pg_extension_update_paths('c77_rbac');
-- Verify tables exist
SELECT tablename FROM pg_tables WHERE tablename LIKE 'c77_rbac_%';
-- Check function permissions
SELECT routine_name, specific_name FROM information_schema.routines
WHERE routine_name LIKE 'c77_rbac_%';
```
### Log Analysis
Check PostgreSQL logs for detailed error information:
```bash
# Ubuntu/Debian
sudo tail -f /var/log/postgresql/postgresql-14-main.log
# CentOS/RHEL
sudo tail -f /var/lib/pgsql/14/data/log/postgresql-*.log
# macOS Homebrew
tail -f /opt/homebrew/var/log/postgresql@14.log
```
## Uninstallation
### Safe Uninstallation Process
1. **Check dependencies first:**
```sql
SELECT * FROM public.c77_rbac_show_dependencies();
```
2. **Remove all RLS policies:**
```sql
SELECT public.c77_rbac_remove_all_policies();
```
3. **Optionally backup RBAC data:**
```sql
COPY (SELECT * FROM public.c77_rbac_user_permissions) TO '/tmp/rbac_backup.csv' CSV HEADER;
```
4. **Complete cleanup:**
```sql
SELECT public.c77_rbac_cleanup_for_removal(true); -- true = remove data
```
5. **Drop the extension:**
```sql
DROP EXTENSION c77_rbac CASCADE;
```
6. **Remove files from system:**
```bash
sudo rm /usr/share/postgresql/14/extension/c77_rbac*
```
## Production Deployment Checklist
### Pre-Deployment
- [ ] **Database backup completed**
- [ ] **Extension files copied to production server**
- [ ] **PostgreSQL service restarted/reloaded**
- [ ] **Test environment upgrade successful**
- [ ] **Application code updated to handle new features**
- [ ] **Rollback plan prepared**
### Deployment Steps
- [ ] **Connect as superuser**
- [ ] **Install/upgrade extension**
- [ ] **Verify installation with test script**
- [ ] **Grant privileges to application users**
- [ ] **Configure initial roles and features**
- [ ] **Apply RLS policies to application tables**
- [ ] **Test application connectivity**
### Post-Deployment
- [ ] **Monitor PostgreSQL logs for errors**
- [ ] **Verify application functionality**
- [ ] **Check performance metrics**
- [ ] **Update monitoring alerts**
- [ ] **Document installation for team**
### Production Configuration Example
```bash
#!/bin/bash
# production_deploy.sh
set -e # Exit on any error
echo "Starting c77_rbac production deployment..."
# Backup database
pg_dump -U postgres -h localhost myapp_production > backup_$(date +%Y%m%d_%H%M%S).sql
# Copy extension files
sudo cp c77_rbac.control /usr/share/postgresql/14/extension/
sudo cp c77_rbac--1.1.sql /usr/share/postgresql/14/extension/
# Install extension
sudo -u postgres psql -d myapp_production -c "CREATE EXTENSION IF NOT EXISTS c77_rbac;"
# Verify installation
sudo -u postgres psql -d myapp_production -c "SELECT extname, extversion FROM pg_extension WHERE extname = 'c77_rbac';"
# Run initialization script
sudo -u postgres psql -d myapp_production -f court_system_setup.sql
echo "Deployment completed successfully!"
```
This installation guide provides comprehensive coverage of all installation scenarios with detailed examples and troubleshooting information. The step-by-step approach ensures successful deployment in any environment.