Изучение различных подходов к управлению разрешениями при разработке программного обеспечения

Разрешения играют решающую роль в разработке программного обеспечения, позволяя разработчикам контролировать доступ и действия внутри приложения. В этой статье блога мы рассмотрим различные методы обработки разрешений и предоставим примеры кода для каждого подхода. Понимая эти методы, разработчики могут реализовать надежные системы разрешений, адаптированные к их конкретным требованиям.

  1. Управление доступом на основе ролей (RBAC):
    RBAC – это широко распространенный подход, который назначает разрешения на основе заранее определенных ролей. Пользователям назначается одна или несколько ролей, и каждая роль имеет связанный с ней набор разрешений. Вот пример кода на Python с использованием платформы Flask:
from functools import wraps
from flask import abort
def permission_required(permission):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, kwargs):
            # Check if the user has the required permission
            if not current_user.has_permission(permission):
                abort(403)  # Unauthorized
            return func(*args, kwargs)
        return wrapper
    return decorator
@app.route('/admin/dashboard')
@permission_required('admin_dashboard_access')
def admin_dashboard():
    # Code for admin dashboard
    pass
  1. Контроль доступа на основе атрибутов (ABAC).
    ABAC фокусируется на оценке атрибутов пользователя, ресурса и среды для определения доступа. Политики определяются с использованием логических правил, учитывающих эти атрибуты. Вот пример кода с использованием гипотетической библиотеки ABAC на Python:
from abac import PolicyEnforcementPoint, AccessRequest, Attribute
# Define policies
policy = {
    'target': {
        'resource': Attribute('resource.type', 'dashboard'),
        'action': Attribute('action', 'view'),
        'user_role': Attribute('user.role', 'admin')
    },
    'rule': {
        'decision': 'permit'
    }
}
# Check access
pdp = PolicyEnforcementPoint(policies=[policy])
access_request = AccessRequest(
    action='view',
    resource={'type': 'dashboard'},
    user={'role': 'admin'}
)
decision = pdp.decide(access_request)
if decision:
    # Grant access
    pass
else:
    # Deny access
    pass
  1. Списки контроля доступа (ACL):
    ACL определяют права доступа к отдельным ресурсам или объектам. Каждый ресурс поддерживает список пользователей или ролей с определенными разрешениями. Вот пример кода на Java:
public class Resource {
    private Map<String, Set<String>> acl;
    public Resource() {
        acl = new HashMap<>();
    }
    public void addPermission(String userOrRole, String permission) {
        if (!acl.containsKey(userOrRole)) {
            acl.put(userOrRole, new HashSet<>());
        }
        acl.get(userOrRole).add(permission);
    }
    public boolean hasPermission(String userOrRole, String permission) {
        Set<String> permissions = acl.get(userOrRole);
        return permissions != null && permissions.contains(permission);
    }
}
// Usage
Resource dashboardResource = new Resource();
dashboardResource.addPermission("admin", "view");
dashboardResource.addPermission("user", "view");
if (dashboardResource.hasPermission(currentUser, "view")) {
    // Grant access
} else {
    // Deny access
}
  1. Управление доступом на основе правил (RBAC).
    RBAC определяет разрешения на основе набора правил или условий. Правила оцениваются для определения прав доступа. Вот пример кода на JavaScript с использованием библиотеки правил Nools:
const nools = require('nools');
// Define rules
const rule = `
    rule "dashboard access"
        when
            user.role == "admin"
        then
            allow();
    `;
// Create the rule engine
const flow = nools.compile(rule);
const session = flow.getSession();
// Set user attributes
const user = { role: 'admin' };
session.assert(user);
// Fire rules
session.match();
// Check access
if (user.access === 'allow') {
    // Grant access
} else {
    // Deny access
}