Я создаю сервис авторизации для моего приложения nestjs.
Для каждого защищенного ресурса в моем приложении (Media
, Game
, ...) у меня есть *RoleEntity
(MediaRoleEntity
, GameRoleEntity
, ...), который определяет, что может пользователь делать с конкретным ресурсом. Каждый из этих *RoleEntity
реализует RoleEntityInterface
:
export interface RoleEntityInterface<T extends ResourceEntity> {
resource: T;
user: UserEntity;
role: string;
}
Каждый защищаемый объект (MediaEntity
, GameEntity
, ...) расширяется ResourceEntity
.
Теперь я хочу создать универсального поставщика RoleService
, отвечающего за взаимодействие с базой данных:
@Injectable()
export class RoleService<T extends ResourceEntity> {
readonly roleRepository: Repository<RoleEntityInterface<T>>;
async read(roleDto: Partial<RoleDto<T>>): Promise<RoleEntityInterface<T>> {
return this.roleRepository.findOne({
where: { ...roleDto },
});
}
async create(roleDto: RoleDto<T> | RoleDto<T>[]): Promise<void> {
await this.roleRepository.insert(roleDto);
}
}
И я хочу внедрить эту услугу в охранников, перехватчиков ...
Проблема, я не знаю, как это сделать, точнее:
- Как я могу динамически внедрить ролевый репозиторий? (Я предполагаю, что должна быть задействована какая-то фабрика.)
СЛУЧАЙ РЕАЛЬНОГО ИСПОЛЬЗОВАНИЯ
Я хочу иметь возможность защитить ресурсы с помощью охранника:
@Injectable()
export class RoleGuard<T extends ResourceEntity> implements CanActivate {
constructor(
private authService: AuthService,
private roleService: RoleService<T>,
private readonly reflector: Reflector,
) {}
...
}
Теперь в контроллере, когда я использую
@Role('Admin')
@UseGuards(RoleGuard<MediaEntity>)
Get()
...
Было бы идеально, если бы все это волшебным образом работало :), т. Е. Правильно добавлен правильный roleService с правильным roleRepository.
Я совершенно новичок в nestjs и машинописи (и никогда не играл с angular), поэтому, возможно, весь подход неверен.