覆盖身份验证失败处理程序 - Symfony2

2024-01-21

我正在扩展身份验证失败处理程序,一切都主要工作正常,但有一个小问题。

这是我的 services.yml:

  http.utils.class:
    class: Symfony\Component\Security\Http\HttpUtils
  auth.fail:
    class: Acme\MyBundle\AuthenticationFailure
    arguments:
      - @http_kernel
      - @http.utils.class
      - []

我已将其设置为在 security.yml 中使用:

failure_handler: auth.fail

这是我的 Acme\MyBundle\AuthenticationFailure.php:

namespace Acme\MyBundle;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler;
use Symfony\Component\HttpFoundation\Response;

class AuthenticationFailure extends DefaultAuthenticationFailureHandler
{

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {

        //do something

    }

}

问题是我在 security.yml 中设置的选项被忽略。我知道该类的 _construct 方法的第三个参数是 $options 数组,并且我没有传递任何内容作为第三个参数(在 services.yml 中),所以我猜测这就是问题所在,解决方案可以只是传递值。我猜我也可以做这样的事情:

arguments:
  - @http_kernel
  - @http.utils.class
  - %security.firewalls.secure_area.form_login%

....我没有测试过,因为问题是这是在 services.yml 中进行硬编码,而且它并不理想,因为如果我更改 secure_area 的名称,它就会崩溃。当然这些值可以通过更好的方式获得吗?


我看到你正试图通过登录路径到您的身份验证失败处理程序...

...你应该注射@router,适应__construct方法并生成 url路线名称 ( 不是图案)由您的防火墙在身份验证失败处理程序中使用。然后将用户重定向到那里...

login_path: your_login_route_name # <- not a pattern like /login

这样更改防火墙的名称不会破坏您的应用程序!


如果您甚至不想在更改路由名称时破坏应用程序,您也可以进行配置:

配置.yml

parameters:
   login.route_name: my_login_route_name

路由.yml

%login.route_name%:
     pattern: /login

安全.yml

security:
    firewalls:
        your_firewall_name:
             failure_handler: auth.fail
             login_path:      %login.route_name%

服务.yml

auth.fail:
     arguments:
         - # ...
         - @router
         - %login.route_name%

Acme\MyBundle\AuthenticationFailure

use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

// ...

protected $router;

protected $loginRoute;

public function __construct( 
    /** ... other arguments **/, 
    RouterInterface $router, 
    $loginRoute
) 
{ 
    // ..
    $this->router     = $router;
    $this->loginRoute = $loginRoute;
}

public function onAuthenticationFailure(
    Request $request, 
    AuthenticationException $exception
)
{

    // ...

    return new RedirectResponse( $this->router->generate($this->loginRoute) ); 
}

关于您的建议的提示

(...使用类似的东西%security.firewalls.secure_area.form_login% )

您无法直接访问安全配置(这些不是参数 - 您不能使用%security.firewall.whatever% ! ) ...

默认的$options传递给__construct必须是一个数组...

...所以你可能需要将传递的参数包围起来[]如果这些参数不是数组。

arguments:
    - [ %parameter1% , %parameter2% ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖身份验证失败处理程序 - Symfony2 的相关文章

随机推荐

  • 詹金斯:节流构建率

    Using Jenkins 是否有可能限制作业执行在给定的时间间隔内只运行一次 例如 我需要配置一项应该执行的昂贵作业每小时不超过2次 Note 我无法使用安静期功能 因为一旦在安静周期间隔内发生另一个构建触发 其计时器将被重置 如果此类构
  • 雷夏珀正确吗?

    我刚刚安装了 Reshaper 4 5 它提出了以下建议 return this GetRuleViolations Count 0 REMOVE this new string this ID ToString this Registra
  • 文件句柄作为函数参数的类型提示

    我目前正在研究一些 PHP 代码 并试图使其更新 我找到了一个函数 它检索文件句柄 通过fopen 返回类型是stream 我用它检查过 handle fopen myfile csv r var dump get resource typ
  • 无法在 macOS Sierra 上将程序集文件 (.s) 与 GCC 链接

    我有 2 个文件要编译 第一个是 main c 第二个是在汇编 work s 中执行求和和乘法的函数 这是代码 main c 文件 include
  • AVCaptureSession条码扫描

    我目前正在与AVCaptureSession and AVCaptureMetadataOutput 它工作得很好 但我只想知道如何指示仅在特定区域扫描和分析元数据对象AVCaptureVideoPreviewLayer 这是我项目中的代码
  • Visual Studio Community 2015 无法登录。如何修复此问题?

    每当我打开 Visual Studio Community 2015 时 它都会要求我更新许可证 它不会让我下载更新的许可证 因为每次我尝试时 它都会告诉我检查我的网络或代理 我没有代理 而且我的网络很好 此外 当我单击 添加帐户 按钮 本
  • 如何在 Symfony2 中使用命名空间会话

    我正在尝试使用 symfony2 会话 我这样做 session this gt getRequest gt getSession session gt set token value 这有效 但我想在会话中使用名称空间 文件说 class
  • 如何在构图中初始化相机

    我想通过 compose androidView 来获取相机视图 但以下代码似乎不适合我 Composable fun CameraPreviewScreen val lifecycleOwner LifecycleOwnerAmbient
  • 使用 TypeScript 解构函数参数中的 props

    我正在尝试在我的组件库中使用 TypeScript 并尝试将 React 中的无状态功能组件从 ES6 JavaScript 转换为 TypeScript 我想知道如何避免重复自己 同时仍然能够在传递参数时解构函数外部的 props 我的组
  • libgdx 网格渲染问题

    I have a very simple program that loads an wavefront obj file rotate and displays it The problem is that the program ren
  • 所需值的完整路径

    如何获取表中所需值的完整路径 我想通过代理表跟踪另一个表中的更改 我知道我需要在其中使用元表和 index 但我还没能想出一个追踪器 表结构示例 Objects Panel layer 1 x 600 y 328 w 331 h 491 o
  • 如何选择从哪个 Outlook 帐户发送邮件项目 - 可靠地使用 SendUsingAccount

    假设您有多个帐户附加到 Outlook 客户端 并且希望能够使用 VBA 选择从哪个帐户发送邮件 你做什么工作 MailItem SendUsingAccount 参数看起来是执行此操作的正确方法 并在其他地方推荐像这儿 https sta
  • Apple 钥匙串存储客户端身份,因此只有我的应用程序可以访问它

    Aim 我需要以安全的方式在 OS X 应用程序上存储客户端身份 以便只有我的应用程序可以访问它 没有提示请求权限 Problem 当我尝试存储客户身份时 问题立即出现 这是代码示例 到目前为止我已经绑定了什么 BOOL saveClien
  • 制作 Ruby Gem - 无法加载此类文件

    我正在尝试使用以下说明构建 Ruby gemhttp guides rubygems org make your own gem http guides rubygems org make your own gem 以下似乎工作正常并生成了
  • 有没有一种简单的方法来创建带有编码对话框的 C# .NET 文件对话框?

    我试图让用户在 C 和 VS2008 中加载或保存文件时选择文件编码 记事本的对话框底部有一个编码下拉选项 有一种方法可以做到这一点 如下所述 http www codeproject com KB cs getsavefilename a
  • 通过react-redux操作负载传递输入值?

    export class SearchBar extends React Component render return div div
  • 主管 - 用户名无效[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在 Ubuntu 16 04 上运行主管 安装时没有出现问题 我创建了文件 etc supervisor conf d test
  • Java可以删除到回收站吗?

    Java是这里的关键 我需要能够删除文件 但用户希望能够从回收站 取消删除 据我所知这是不可能的 还有人知道吗 十年后 Java 9 终于提供了一种将文件移动到垃圾箱的内置方法 java awt Desktop moveToTrash ja
  • AWS Transcribe Streaming BadRequestException:“无法解码音频流...”

    我正在使用 Websockets 在 Dart Flutter 中构建一个 Transcribe Streaming 应用程序 当我流式传输测试音频 从单声道 16kHz 16 位签名的小端 WAV 文件中提取 时 我得到 BadReque
  • 覆盖身份验证失败处理程序 - Symfony2

    我正在扩展身份验证失败处理程序 一切都主要工作正常 但有一个小问题 这是我的 services yml http utils class class Symfony Component Security Http HttpUtils aut