danilovl / permission-middleware-bundle
Symfony 扩展包提供了一种简单的机制来控制类或其方法的权限。
v2.7.3
2024-06-04 18:53 UTC
Requires
- php: ^8.3
- symfony/framework-bundle: ^7.0
- symfony/security-bundle: ^7.0
- symfony/translation-contracts: ^3.4
Requires (Dev)
- phpunit/phpunit: ^10.2
README
PermissionMiddlewareBundle
关于
Symfony 扩展包提供了一种简单的机制来控制类或其方法的权限。
需求
- PHP 8.3 或更高版本
- Symfony 7.0 或更高版本
1. 安装
使用 Composer 安装 danilovl/permission-middleware-bundle
包
composer require danilovl/permission-middleware-bundle
如果未自动添加,请将 PermissionMiddlewareBundle
添加到您的应用程序的包中
<?php // config/bundles.php return [ // ... Danilovl\PermissionMiddlewareBundle\PermissionMiddlewareBundle::class => ['all' => true] ];
2. 使用方法
为属性配置树选项。
accessDeniedHttpException
参数对于创建自定义响应而不希望抛出默认的 AccessDeniedHttpException 时的 ClassMiddleware
、ServiceMiddleware
将非常有用。
$configurationTree = [ 'user' => [ 'roles', 'userNames', 'exceptionMessage' => [ 'message', 'messageParameters', 'domain', 'locale' ], 'redirect' => [ 'route', 'parameters', 'flash' => [ 'type', 'trans' => [ 'message', 'messageParameters', 'domain', 'locale' ] ] ] ], 'date' => [ 'from', 'to', 'exceptionMessage' => [ 'message', 'messageParameters', 'domain', 'locale' ], 'redirect' => [ 'route', 'parameters', 'flash' => [ 'type', 'trans' => [ 'message', 'messageParameters', 'domain', 'locale' ] ] ] ], 'redirect' => [ 'route', 'parameters', 'flash' => [ 'type', 'trans' => [ 'message', 'messageParameters', 'domain', 'locale' ] ] ], 'class' => [ 'name', 'method', 'exceptionMessage' => [ 'message', 'messageParameters', 'domain', 'locale' ], 'redirect' => [ 'route', 'parameters', 'flash' => [ 'type', 'trans' => [ 'message', 'messageParameters', 'domain', 'locale' ] ] ] ], 'service' => [ 'name', 'method', 'exceptionMessage' => [ 'message', 'messageParameters', 'domain', 'locale' ], 'redirect' => [ 'route', 'parameters', 'flash' => [ 'type', 'trans' => [ 'message', 'messageParameters', 'domain', 'locale' ] ] ] ], 'environment', 'afterResponse' ];
您可以使用 PermissionMiddleware
属性为类或方法。 ClassMiddleware
、ServiceMiddleware
的方法接受 Symfony\Component\HttpKernel\Event\ControllerEvent
作为参数,并必须返回布尔值。
<?php declare(strict_types=1); namespace App\Controller; use Danilovl\PermissionMiddlewareBundle\Attribute\PermissionMiddleware; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\{ Request, Response }; #[PermissionMiddleware( user: [ 'roles' => ['ROLE_SUPERVISOR'], 'userNames' => ['admin'], 'exceptionMessage' => [ 'message' => 'app.permission_method_user_error_message' ], 'redirect' => [ 'route' => 'profile_show', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] ], date: [ 'from' => '01-01-2021', 'exceptionMessage' => [ 'message' => 'app.permission_date_error_message' ], 'redirect' => [ 'route' => 'profile_show', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] ], redirect: [ 'route' => 'profile_show', 'flash' => [ 'type' => 'warning', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ], class: [ 'name' => 'App\Middleware\HomeControllerMiddleware', 'method' => 'handle', 'exceptionMessage' => [ 'message' => 'app.permission_date_error_message' ], 'redirect' => [ 'route' => 'profile_show', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] ], service: [ 'name' => 'app.middleware.home_controller', 'method' => 'handle', ] )] class HomeController extends AbstractController { #[PermissionMiddleware( user: [ 'roles' => ['ROLE_SUPERVISOR'], 'userNames' => ['admin'], 'exceptionMessage' => [ 'message' => 'app.permission_method_user_error_message' ], 'redirect' => [ 'route' => 'profile_show', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] ], date: [ 'from' => '01-01-2021', 'exceptionMessage' => [ 'message' => 'app.permission_date_error_message' ], 'redirect' => [ 'route' => 'profile_show', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] ], redirect: [ 'route' => 'profile_show', 'flash' => [ 'type' => 'warning', 'trans' => [ 'message' => 'app.permission_action_flash_message' ] ] ] )] public function index(Request $request): Response { return $this->render('home/index.html.twig'); } #[PermissionMiddleware( date: [ 'to' => '31-12-2020', 'redirect' => [ 'route' => 'new_news', 'flash' => [ 'type' => 'warning', 'trans' => [ 'message' => 'app.old_section_is_closed' ] ] ] ] )] public function oldNews(Request $request): Response { return $this->render('home/news.html.twig'); } #[PermissionMiddleware( date: [ 'from' => '01-01-2021', 'redirect' => [ 'route' => 'new_news', 'flash' => [ 'type' => 'warning', 'trans' => [ 'message' => 'app.new_section_is_open', 'parameters' => ['date' => '01-01-2021'], 'domain' => 'flashes', 'locale' => 'en' ] ] ] ] )] public function news(Request $request): Response { return $this->render('home/news.html.twig'); } #[PermissionMiddleware( user: [ 'roles' => ['ROLE_SUPERVISOR'], 'userNames' => ['admin'], 'redirect' => [ 'route' => 'homepage', 'flash' => [ 'type' => 'error', 'trans' => [ 'message' => 'app.permission_denied' ] ] ] ] )] public function editNews(Request $request): Response { return $this->render('home/edit_news.html.twig'); } #[PermissionMiddleware( redirect: [ 'route' => 'homepage' ] )] public function redirect(Request $request): Response { return $this->render('home/redirect.html.twig'); } #[PermissionMiddleware( redirect: [ 'route' => 'homepage', 'flash' => [ 'type' => 'success', 'trans' => [ 'message' => 'app.redirect_success' ] ] ] )] public function redirectWithFlash(Request $request): Response { return $this->render('home/redirect.html.twig'); } #[PermissionMiddleware( user: [ 'roles' => ['ROLE_ADMIN'], 'userNames' => ['admin'], 'redirect' => ['route' => 'login'] ] )] public function admin(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( user: [ 'userNames' => ['admin', 'editor', 'publisher'], 'redirect' => [ 'route' => 'login' ] ] )] public function adminByUsernameRedirect(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( user: [ 'userNames' => ['admin', 'editor', 'publisher'], 'exceptionMessage' => [ 'message' => 'app.permission_denied' ] ] )] public function adminByUsernameExceptionMessage(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( class: [ 'name' => 'App\Middleware\ShowCalendarMiddleware', 'method' => 'handle' ] )] public function showCalendar(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( service: [ 'name' => 'app.middleware.create_article', 'method' => 'handle' ] )] public function createArticle(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( service: [ 'name' => 'app.middleware.create_article', 'method' => 'handle' ], environment: ['dev'] )] public function createArticleOnyForDev(Request $request): Response { return $this->render('home/admin.html.twig'); } #[PermissionMiddleware( service: [ 'name' => 'app.middleware.create_article', 'method' => 'handle' ], environment: ['dev'], afterResponse: true )] public function createArticleResponse(Request $request): Response { return $this->render('home/admin.html.twig'); } }
3. 示例 service
、class
处理器
简单的基本处理器。
<?php declare(strict_types=1); namespace App\Application\Controller; class MiddlewareController { public function __invoke(): bool { return true; } }
带有 ControllerEvent
参数的简单处理器。您可以更改响应。
<?php declare(strict_types=1); namespace App\Application\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ControllerEvent; class MiddlewareController { public function __invoke(ControllerEvent $event): bool { $request = $event->getRequest(); if ($request->isXmlHttpRequest()) { return false; } $event->setController(static fn(): Response => new Response('Unauthorized', 401)); return true; } }
返回 JsonResponse
。
<?php declare(strict_types=1); namespace App\Application\Controller; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Event\ControllerEvent; class MiddlewareController { public function __invoke(ControllerEvent $event): bool { $request = $event->getRequest(); if ($request->isXmlHttpRequest()) { return false; } $event->setController(static fn(): JsonResponse => new JsonResponse('Unauthorized', 401)); return true; } }
返回 RedirectResponse
。
<?php declare(strict_types=1); namespace App\Application\Controller; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Event\ControllerEvent; class MiddlewareController { public function __invoke(ControllerEvent $event): bool { $request = $event->getRequest(); if ($request->isXmlHttpRequest()) { return false; } $event->setController(static fn(): RedirectResponse => new RedirectResponse('https://www.google.com/', 302)); return true; } }
许可证
PermissionMiddlewareBundle 是开源软件,受 MIT 许可 许可。