6

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

这是我的 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 的名称它会中断。当然,这些值可以以更好的方式获得吗?

4

1 回答 1

8

我看到您正在尝试将login_path传递给您的身份验证失败处理程序...

...您应该注入@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% ]
于 2013-07-10T01:24:01.390 回答