/
tm-project
/
rbac-react-system
Обзор
Документация
Войти
/
tm-project
/
rbac-react-system
Код
Запросы
0
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
gitverse
src/application/services/AuthorizationService.ts
106 строк
6 KB
Artem
chore: release v1.0.4
30 ноя 2025, 22:51
30 ноя 2025, 22:51
f6f509c
Код
Авторство
О чём код?
/** * rbac-react-system v1.0.4 * Copyright (c) 2025 TM Project * Licensed under the MIT License */ import { IAuthorizationService } from '../../domain/interfaces' import { User } from '../../domain/entities' import { CheckPermissionUseCase, CheckRoleUseCase } from '../use-cases' /** * Реализация сервиса авторизации. * Оркестрирует юз-кейсы для предоставления функциональности авторизации. */ export class AuthorizationService implements IAuthorizationService { /** * Создаёт экземпляр сервиса авторизации. * * @param {CheckPermissionUseCase} checkPermissionUseCase - Юз-кейс для проверки прав доступа. * @param {CheckRoleUseCase} checkRoleUseCase - Юз-кейс для проверки ролей пользователя. */ constructor( private readonly checkPermissionUseCase: CheckPermissionUseCase, private readonly checkRoleUseCase: CheckRoleUseCase ) {} /** * Проверяет, может ли пользователь получить доступ к указанному ресурсу с заданным действием. * * @param {string} resource - Название ресурса (например, 'users', 'posts'). * @param {string} action - Название действия (например, 'read', 'write', 'delete'). * @param {User} user - Пользователь, для которого проверяется доступ. * @returns {Promise<boolean>} Промис, разрешающийся значением `true`, если доступ разрешён, иначе — `false`. */ async canAccess(resource: string, action: string, user: User): Promise<boolean> { return this.checkPermissionUseCase.execute(user.id, resource, action) } /** * Проверяет, обладает ли пользователь указанной ролью (включая роли, полученные по наследованию). * * @param {string} role - Идентификатор или название роли. * @param {User} user - Пользователь, для которого выполняется проверка. * @returns {Promise<boolean>} Промис, разрешающийся значением `true`, если пользователь имеет указанную роль, иначе — `false`. */ async hasRole(role: string, user: User): Promise<boolean> { return this.checkRoleUseCase.execute(user.id, role) } /** * Проверяет, имеет ли пользователь указанное разрешение. * Разрешение может быть указано в формате "ресурс:действие" или как ID разрешения. * * @param {string} permission - Строка разрешения в формате 'ресурс:действие' (например, 'users:read') или идентификатор разрешения. * @param {User} user - Пользователь, для которого выполняется проверка. * @returns {Promise<boolean>} Промис, разрешающийся значением `true`, если пользователь имеет разрешение, иначе — `false`. */ async hasPermission(permission: string, user: User): Promise<boolean> { // Разбираем строку разрешения const parts = permission.split(':') if (parts.length === 2) { // Формат: "ресурс:действие" const [resource, action] = parts return this.checkPermissionUseCase.execute(user.id, resource, action) } // Если формат не соответствует "ресурс:действие", проверяем наличие в прямых разрешениях return user.permissions.includes(permission) } /** * Возвращает все эффективные разрешения пользователя (прямые + по ролям + унаследованные). * * @param {User} user - Пользователь, для которого запрашиваются разрешения. * @returns {Promise<string[]>} Промис, разрешающийся массивом строк разрешений в формате 'ресурс:действие'. */ async getUserEffectivePermissions(user: User): Promise<string[]> { const permissions = new Set<string>() // Добавляем прямые разрешения пользователя user.permissions.forEach(p => permissions.add(p)) // Получаем все эффективные роли пользователя const roles = await this.checkRoleUseCase.getAllEffectiveRoles(user.id) // Для каждой роли нужно загрузить и добавить разрешения (упрощённая реализация) // Полноценная реализация должна запрашивать разрешения по ролям roles.forEach(() => { // Здесь должны быть загружены разрешения для роли и добавлены в `permissions` // Пока реализовано как заглушка }) return Array.from(permissions) } /** * Возвращает все эффективные роли пользователя (назначенные напрямую + унаследованные). * * @param {User} user - Пользователь, для которого запрашиваются роли. * @returns {Promise<string[]>} Промис, разрешающийся массивом идентификаторов ролей. */ async getUserEffectiveRoles(user: User): Promise<string[]> { return this.checkRoleUseCase.getAllEffectiveRoles(user.id) } }