Package: librbac
Общая библиотека контроля доступа для микросервисовПодключениеsettings.py:INSTALLED_APPS=[# другие приложение'testapp.core','librbac',# для management команд rbac'librbac.contrib.migrations',# для поддержки миграций]REST_FRAMEWORK={'DEFAULT_AUTHENTICATION_CLASSES':('oidc_auth.authentication.JSONWebTokenAuthentication',),}OIDC_AUTH={# URL сервиса аутентификации, необходимо указать своё значение'OIDC_ENDPOINT':'http://testserver/oauth',# функция преобразующая токен в объект пользователя. Указать как есть.'OIDC_RESOLVE_USER_FUNCTION':'librbac.oidc.auth.get_user_from_token',# Заголовок в котором хранится токен. Указать как есть.'JWT_AUTH_HEADER_PREFIX':'Bearer',# The Claims Options can now be defined by a static string.# ref: https://docs.authlib.org/en/latest/jose/jwt.html#jwt-payload-claims-validation# The old OIDC_AUDIENCES option is removed in favor of this new option.# `aud` is only required, when you set it as an essential claim.'OIDC_CLAIMS_OPTIONS':{'iss':{'essential':True,}},}RBAC_BACKEND='librbac.backends.remote.RemoteBackend'"""Путь до бэкенда RBAC"""RBAC_PERMISSION_TOPIC='test.rbac.permission'"""Наименование топика в который публикуются события связанные с разрешениями."""testapp/__init__.py:fromtypingimportTYPE_CHECKINGfromexplicit.contrib.messagebus.event_registryimportRegistryifTYPE_CHECKING:fromexplicit.messagebus.messagebusimportMessageBus# noqadefault_app_config=f'{__package__}.apps.AppConfig'bus:'MessageBus'event_registry=Registry()testapp/apps.py:fromdjango.apps.configimportAppConfigasAppConfigBasefromlibrbac.eventsimportPermissionPushedfromlibrbac.utils.managementimportis_in_management_commandclassAppConfig(AppConfigBase):name=__package__def_bootstrap(self):"""Предоставление общей шины ядра."""fromexplicit.messagebus.messagebusimportMessageBusfromtestappimportcorefrom.unit_of_workimportUnitOfWorkuow=UnitOfWork()dependencies=dict(uow=uow)messagebus=MessageBus(**dependencies)core.bus=messagebusdef_register_event_handlers(self):...def_configure_rbac(self):fromlibrbacimportconfigfromlibrbac.managerimportrbacfromtestappimportcorefromtestapp.coreimportevent_registryasregistryfromtestapp.core.adaptersimportmessagingclassConfig(config.IConfig):bus=core.busadapter=messaging.adapterevent_registry=registryconfig.rbac_config=Config()# не пушим разрешения в шину при старте. Этим занимается management команда.rbac.init()defready(self):self._bootstrap()self._register_events()self._configure_rbac()testapp/permissions.pyfromlibrbac.typesimportPermissionfromlibrbac.typesimportPermissionGroupPERM_NAMESPACE_TEST='test'PERM_RESOURCE__PERSON='person'PERM__PERSON__READ=Permission(# (namespace, resource, action, scope)PERM_NAMESPACE_TEST,PERM_RESOURCE__PERSON,'read')PERM__PERSON__WRITE=Permission(PERM_NAMESPACE_TEST,PERM_RESOURCE__PERSON,'write')# Описание разрешений# -----------------------------------------------------------------------------permissions=((PERM__PERSON__READ,'Просмотр ФЛ'),(PERM__PERSON__WRITE,'Редактирование ФЛ'),)dependencies={PERM__PERSON__WRITE:{PERM__PERSON__READ,},}# -----------------------------------------------------------------------------# Описание связей разделов и групп разрешенийpartitions={'Администрирование':(PermissionGroup(PERM_NAMESPACE_TEST,PERM_RESOURCE__PERSON),),}# -----------------------------------------------------------------------------testapp/views.pyfromrest_framework.viewsetsimportModelViewSetfromlibrbac.drf.viewsetsimportRBACMixinfrom.permissionsimportPERM__PERSON__READfrom.permissionsimportPERM__PERSON__WRITEclassPersonViewSet(RBACMixin,ModelViewSet):# сопоставление действий с разрешениямиperm_map=dict(create=(PERM__PERSON__WRITE,),partial_update=(PERM__PERSON__WRITE,),destroy=(PERM__PERSON__WRITE,),retrieve=(PERM__PERSON__READ,),list=(PERM__PERSON__READ,),)...Миграции разрешенийОписаниев модуле миграцийЗапуск тестов$ tox