permission_policy 3.1.0 copy "permission_policy: ^3.1.0" to clipboard
permission_policy: ^3.1.0 copied to clipboard

A flexible and powerful permission management system for Flutter applications with role-based access control, hierarchical permissions, and customizable UI components.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:permission_policy/permission_policy.dart';

void main() async {
  // Initialize the permission system
  await initializePermissions();

  runApp(const MyApp());
}

Future<void> initializePermissions() async {
  final policy = PermissionPolicy.instance;

  // Initialize the permission system
  await policy.initialize();

  // Configure with detailed permissions and roles
  await policy.configure(
    permissions: const [
      Permission(
        id: 'view_content',
        name: 'View Content',
        description: 'Can view regular content',
        category: 'content',
      ),
      Permission(
        id: 'view_exclusive_content',
        name: 'View Exclusive Content',
        description: 'Can view premium exclusive content',
        category: 'content',
        priority: 1,
      ),
      Permission(
        id: 'create_content',
        name: 'Create Content',
        description: 'Can create new content',
        category: 'content',
        priority: 2,
      ),
      Permission(
        id: 'edit_content',
        name: 'Edit Content',
        description: 'Can edit existing content',
        category: 'content',
        priority: 2,
        inheritsFrom: ['create_content'], // Inherits create permission
      ),
      Permission(
        id: 'delete_content',
        name: 'Delete Content',
        description: 'Can delete content',
        category: 'content',
        priority: 3,
      ),
      Permission(
        id: 'manage_users',
        name: 'Manage Users',
        description: 'Can manage user accounts',
        category: 'admin',
        priority: 4,
      ),
      Permission(
        id: 'system_admin',
        name: 'System Administration',
        description: 'Full system access',
        category: 'admin',
        priority: 5,
      ),
    ],
    roles: const [
      Role(
        id: 'guest',
        name: 'Guest',
        description: 'Basic guest access',
        permissions: ['view_content'],
        priority: 1,
      ),
      Role(
        id: 'user',
        name: 'User',
        description: 'Regular user with basic permissions',
        permissions: ['view_content'],
        priority: 2,
      ),
      Role(
        id: 'subscriber',
        name: 'Subscriber',
        description: 'Premium subscriber with exclusive content access',
        permissions: ['view_content', 'view_exclusive_content'],
        priority: 3,
        inheritsFrom: ['user'], // Inherits from user role
      ),
      Role(
        id: 'content_creator',
        name: 'Content Creator',
        description: 'Can create and manage content',
        permissions: ['view_content', 'create_content', 'edit_content'],
        priority: 4,
      ),
      Role(
        id: 'moderator',
        name: 'Moderator',
        description: 'Can moderate content and basic user management',
        permissions: [
          'view_content',
          'view_exclusive_content',
          'edit_content',
          'delete_content'
        ],
        priority: 5,
        inheritsFrom: ['subscriber', 'content_creator'],
      ),
      Role(
        id: 'admin',
        name: 'Administrator',
        description: 'Full administrative access',
        permissions: ['system_admin', 'manage_users'],
        priority: 10,
        inheritsFrom: ['moderator'], // Inherits all moderator permissions
      ),
    ],
  );

  // Set up the device with a default guest role
  await policy.giveRole('guest');
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Permission Policy Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Permission Policy Demo"),
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
      ),
      body: SafeArea(
        child: SingleChildScrollView(
          padding: const EdgeInsets.all(16),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              const SizedBox(height: 20),

              // Role selector section
              Card(
                child: Padding(
                  padding: const EdgeInsets.all(16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        'Select Roles',
                        style: Theme.of(context).textTheme.titleLarge,
                      ),
                      const SizedBox(height: 16),
                      SizedBox(
                        height: 300,
                        child: RoleSelector(
                          style: const RoleSelectorStyle.list(),
                          onRoleChanged: (role, isSelected) {
                            if (isSelected) {
                              PermissionPolicy.instance.giveRole(role.id);
                            } else {
                              PermissionPolicy.instance.removeRole(role.id);
                            }
                            setState(() {});
                          },
                        ),
                      ),
                    ],
                  ),
                ),
              ),

              const SizedBox(height: 20),

              // Permission-based UI examples
              Text(
                'Permission-Based UI Examples',
                style: Theme.of(context).textTheme.titleLarge,
              ),
              const SizedBox(height: 16),

              // Basic content viewing
              PermissionGuard(
                permissions: const ['view_content'],
                fallback: Card(
                  color: Colors.red.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.visibility_off, color: Colors.red),
                    title: Text('Basic Content'),
                    subtitle: Text('No permission to view content'),
                  ),
                ),
                child: Card(
                  color: Colors.green.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.visibility, color: Colors.green),
                    title: Text('Basic Content'),
                    subtitle: Text('You can view regular content'),
                  ),
                ),
              ),

              const SizedBox(height: 8),

              // Exclusive content
              PermissionGuard(
                permissions: const ['view_exclusive_content'],
                fallback: Card(
                  color: Colors.grey.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.star_border, color: Colors.grey),
                    title: Text('Exclusive Content'),
                    subtitle: Text('Subscribe to access premium content'),
                  ),
                ),
                child: Card(
                  color: Colors.purple.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.star, color: Colors.purple),
                    title: Text('Exclusive Content'),
                    subtitle: Text('You have access to premium content!'),
                  ),
                ),
              ),

              const SizedBox(height: 8),

              // Content creation
              PermissionGuard(
                permissions: const ['create_content'],
                fallback: const SizedBox.shrink(),
                child: Card(
                  color: Colors.blue.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.add, color: Colors.blue),
                    title: Text('Create Content'),
                    subtitle: Text('You can create new content'),
                  ),
                ),
              ),

              // Content editing (uses permission inheritance)
              PermissionGuard(
                permissions: const ['edit_content'],
                fallback: const SizedBox.shrink(),
                child: Card(
                  color: Colors.orange.shade50,
                  child: const ListTile(
                    leading: Icon(Icons.edit, color: Colors.orange),
                    title: Text('Edit Content'),
                    subtitle: Text(
                        'You can edit content (includes create permission)'),
                  ),
                ),
              ),

              // Admin functions
              PermissionGuard(
                permissions: const ['manage_users'],
                fallback: const SizedBox.shrink(),
                child: Card(
                  color: Colors.red.shade50,
                  child: const ListTile(
                    leading:
                        Icon(Icons.admin_panel_settings, color: Colors.red),
                    title: Text('User Management'),
                    subtitle: Text('You can manage user accounts'),
                  ),
                ),
              ),

              const SizedBox(height: 20),

              // Permission builder example
              PermissionBuilder(
                permissions: const ['system_admin'],
                builder: (context, hasPermission, result) {
                  return ElevatedButton.icon(
                    onPressed: hasPermission
                        ? () {
                            ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                content: Text('System admin action performed!'),
                              ),
                            );
                          }
                        : null,
                    icon: Icon(hasPermission
                        ? Icons.admin_panel_settings
                        : Icons.lock),
                    label: Text(
                        hasPermission ? 'System Admin Panel' : 'Access Denied'),
                    style: ElevatedButton.styleFrom(
                      backgroundColor: hasPermission ? Colors.red : Colors.grey,
                      foregroundColor: Colors.white,
                    ),
                  );
                },
              ),

              const SizedBox(height: 20),

              // Quick actions
              Row(
                children: [
                  Expanded(
                    child: ElevatedButton(
                      onPressed: () async {
                        await PermissionPolicy.instance.clearRoles();
                        setState(() {});
                      },
                      child: const Text('Clear All Roles'),
                    ),
                  ),
                  const SizedBox(width: 16),
                  Expanded(
                    child: ElevatedButton(
                      onPressed: () async {
                        await PermissionPolicy.instance.giveRole('admin');
                        setState(() {});
                      },
                      child: const Text('Make Admin'),
                    ),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}
24
likes
160
points
692
downloads
screenshot

Documentation

API reference

Publisher

verified publishernylo.dev

Weekly Downloads

A flexible and powerful permission management system for Flutter applications with role-based access control, hierarchical permissions, and customizable UI components.

Homepage
Repository (GitHub)
View/report issues

Topics

#roles #permissions #permissions-policy

Funding

Consider supporting this project:

github.com

License

MIT (license)

Dependencies

flutter, nylo_support

More

Packages that depend on permission_policy