sil / route-security-bundle
为symfony应用的所有路由提供安全访问的方式。
2.2.1
2023-03-30 16:28 UTC
Requires
- php: >=8.1
- symfony/expression-language: ^6.0
- symfony/framework-bundle: ^6.0
- symfony/security-core: ^6.0
- symfony/yaml: ^6.0
- twig/twig: ^3.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- symfony/browser-kit: ^6.0
- symfony/security-bundle: ^6.0
- symfony/twig-bundle: ^6.0
README
SilRouteSecurityBundle
此包提供了一种方法,以确保您的应用中所有路由的安全访问,并根据登录用户调整视图。
原则
- 该包为所有配置的路由生成角色。
- 该包监听
kernel.request
事件并检索请求的路由。 - 如果该路由配置为受保护,则该包会检查当前用户是否具有适当的角色。如果没有,则抛出来自Symfony安全组件的AccessDeniedException。您可以在上面看到如何修改此行为。
对于所有配置在访问控制中的路由,用户必须经过身份验证并实现Symfony安全组件的 UserInterface
。
安装
Composer
composer require sil/route-security-bundle
注册包
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Sil\RouteSecurityBundle\SilRouteSecurityBundle(), // ... ); }
添加路由配置
只有当您想使用此包的JavaScript部分时才需要路由。
# app/config/routes/sil_route_security.yaml sil_route_security: resource: "@SilRouteSecurityBundle/Resources/config/routing.yaml"
配置
您可以在 sil_route_security
键下配置此包。
选项
启用访问控制
默认情况下,访问控制是禁用的。
sil_route_security: enable_access_control: true
受保护路由列表
您可以定义受保护路由的列表
sil_route_security: secured_routes: [app_user_list, app_user_add]
受保护路由格式
除了受保护路由列表之外,您还可以定义一个正则表达式格式来配置一组受保护的路由
sil_route_security: secured_routes_format: "/^app_/"
忽略路由列表
您可以定义一组忽略的路由
sil_route_security: ignored_routes: [app_home, app_login, app_logout]
忽略路由格式
除了忽略路由列表之外,您还可以定义一个正则表达式格式来配置一组不受保护的路由
sil_route_security: ignored_routes_format: "/^app_[a-z]*_api/"`
命名策略
默认情况下,为了生成路由的角色,该包将路由名称转换为 ROLE_.strtoupper($route_name)。如果您想使用不同的格式,您可以创建自己的转换器。只需创建一个实现NamingStrategyInterface的服务,并用您的服务标识符配置包选项。
sil_route_security: naming_strategy: my_own_route_to_role_converter
角色提供者
所有生成的角色都可通过 sil_route_security.roles_provider
服务访问。
<?php // Controller ... $rolesProvider = $this->get('sil_route_security.roles_provider'); $generatedRoles = $rolesProvider->getRoles(); ...
例如,您可以将此服务注入到您的 UserFormType
中来配置关联的用户角色。
调整模板视图
该包公开
- 允许您根据用户的角色生成视图的Twig函数。
- 允许您根据用户的角色生成视图的JavaScript对象。
Twig
hasUserAccessToRoute
- 检查用户是否有权限访问指定的路由
- 示例
{% if hasUserAccessToRoute(app.user, 'app_user_add') %} <a href="{{ path('app_user_add') }}">Add user</a> {% endif %}
hasUserAccessAtLeastOneRoute
- 检查用户是否至少可以访问一个路由
- 示例
{% if hasUserAccessAtLeastOneRoute(app.user, ['app_user_add', 'app_user_edit']) %} <span class="dropdown-title">User management</span> <ul class="dropdown-item"> {% if hasUserAccessToRoute(app.user, 'app_user_add') %} <li> <a href="{{ path('app_user_add') }}">Add user</a> </li> {% endif %} {% if hasUserAccessToRoute(app.user, 'app_user_edit') %} <li> <a href="{{ path('app_user_edit') }}">Edit user</a> </li> {% endif %} </ul> {% endif %}
hasUserAccessToRoutes
- 检查用户是否有权限访问所有指定的路由
- 示例
{% if hasUserAccessToRoutes(app.user, ['app_user_add', 'app_user_edit']) %} <a href="{{ path('app_user_add') }}">Add user</a> <a href="{{ path('app_user_edit') }}">Edit user</a> {% endif %}
JavaScript
安装
要在全局范围内加载,请将以下行添加到您的模板中
<script type="text/javascript" src="{{ asset('bundles/silroutesecurity/js/sil_route_security.min.js') }}"></script> <script src="{{ path('sil_route_security.export_js_secured_routes') }}"></script>
用法
if (SilRouteSecurity.hasUserAccessToRoute('name_of_route')) { console.log('Current authenticated user has access to route') } if (SilRouteSecurity.hasUserAccessToRoutes(['name_of_route_1', 'name_of_route_2'])) { console.log('Current authenticated user has access to all routes') } if (SilRouteSecurity.hasUserAccessAtLeastOneRoute(['name_of_route_1', 'name_of_route_2'])) { console.log('Current authenticated user has access to one of this routes') }
拒绝访问行为
当用户访问受保护的路由但没有权限时,将抛出 AccessDeniedException
。框架将其转换为403响应。在此之前,将触发 AccessDeniedToRouteEvent
事件。您可以监听它并实现自己的行为,例如记录操作、返回自定义响应、重定向等...