sil/route-security-bundle

为symfony应用的所有路由提供安全访问的方式。

安装: 5,751

依赖项: 0

建议者: 0

安全: 0

星标: 7

关注者: 1

分支: 1

开放问题: 0

类型:symfony-bundle

2.2.1 2023-03-30 16:28 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:13 UTC


README

Scrutinizer Code Quality Build Status Code Coverage SymfonyInsight

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 事件。您可以监听它并实现自己的行为,例如记录操作、返回自定义响应、重定向等...