繁体   English   中英

更改 symfony2 login_check URL

[英]Change symfony2 login_check URL

我正在根据一套规范实施 Symfony 2 解决方案。 规范规定 GET /login 处的登录表单必须恢复为 POST /login。

如何更改 /login_check 的 URL? 我可以创建一个直接调用安全控制器的路由,如下所示? 我在安全包中没有看到任何控制器。

oft_auth_login:
    pattern: /login
    defaults: { _controller: MagicSecurityBundle:Default:login_check }
    methods: [POST]

根据security.yml的文档,

check_path(类型:字符串,默认值:/login_check)这是您的登录表单必须提交到的路由或路径。 防火墙将拦截对此 URL 的任何请求(默认情况下仅 POST 请求)并处理提交的登录凭据。

所以我必须创建一个有效的路由,但我无法弄清楚它应该指向哪里(防火墙操作?安全操作?)或它应该做什么。

我把它改成 POST /login,但它说找不到它...

现在我有一个如下所示的security.yml文件:

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/login$
        security: false

    secured_area:
        pattern:    ^/
        anonymous: ~
        form_login:
            login_path: oft_auth_login
            check_path: oft_auth_login_check
            username_parameter: user
            password_parameter: passwd

和一个如下所示的routing.yml

oft_auth_login:
    pattern: /login
    defaults: { _controller: OftAuthBundle:Default:login }
    methods: [GET]

oft_auth_login_check:
    pattern: /login
    methods: [POST]

我可以很好地加载表单(GET /login),表单方法是POST,动作是/login,但是当我提交它时,我收到以下错误(404,找不到路由):

无法找到路径“/login”的控制器。 也许您忘记在路由配置中添加匹配的路由? 404 未找到 - NotFoundHttpException

我必须调用哪些代码、防火墙方法等来在自定义check_login方法中对用户进行身份验证,或者以任何其他方式来完成我正在尝试执行的操作,即访问登录表单并将其发布到相同的 URL (/登录)?

在您的security.yml 中,您应该看到如下内容:

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/login$
        security: false

    main:
        pattern:    ^/
        form_login:
            check_path: /login_check
            login_path: /login
            always_use_default_target_path: true
            default_target_path: /secured

在您的routing.yml 中,您应该看到如下内容:

## Security Routes
default:
    pattern:   /
    defaults:  { _controller: SecurityBundle:Security:login }

login:
    pattern:   /login
    defaults:  { _controller: SecurityBundle:Security:login }

login_check:
    pattern:   /login_check

logout:
    pattern: /logout

check_path: /login_check更改为check_path: /new_login_check

将routing.yml 中的pattern: /login_check更改为pattern: /new_login_check

这将更改登录检查路由的 URL。

您的登录表单可能如下所示:

<form action="{{ path('login_check') }}" method="post" class="form-horizontal">

{{ path('login_check') }}片段将 URL 输出到login_check标识的login_check 这与 URL 不同。 示例路由配置(使用 YAML):

route_identifier:
    pattern: /relative/url/path
    defaults: {_controller: ExampleBundle:Example:test}

使用 path('route_identifier') 函数将路由到 URL /relative/URL/path,它调用 ExampleBundle 中 ExampleController 类中的testAction方法。

你应该总是在模板中尽可能使用 Symfony 的路由,这样你就可以避免冲突并可以轻松地更改路由。

与更改登录检查路线有些正交,但重新阅读您的问题,它表示您希望根据 GET/POST 将 /login 路径用于不同的操作。 这需要一个额外的步骤,因为 Symfony 将选择可用的第一个匹配路由。

按照上述操作后,您的routing.yml可能包含以下内容:

## Security Routes
default:
    pattern:   /
    defaults:  { _controller: SecurityBundle:Security:login }

login:
    pattern:   /login
    defaults:  { _controller: SecurityBundle:Security:login }

login_check:
    pattern:   /login

logout:
    pattern: /logout

因此,它只会匹配登录路由,而不会匹配login_check路由。 您还需要指定一个方法:

## Security Routes
default:
    pattern:   /
    defaults:  { _controller: SecurityBundle:Security:login }

login:
    pattern:   /login
    defaults:  { _controller: SecurityBundle:Security:login }
    methods:   [GET]

login_check:
    pattern:   /login
    methods:   [POST]

logout:
    pattern: /logout

有关更多信息,请参阅有关路由的 Symfony 文档。

您将遇到的另一个问题是login_check路由必须与用户登录的防火墙相匹配,但未通过身份验证的用户必须可以访问登录路由!

来自 Symfony 的文档:

接下来,确保您的 check_path URL(例如 /login_check)位于您用于表单登录的防火墙之后(在本例中,单个防火墙匹配所有 URL,包括 /login_check)。 如果 /login_check 与任何防火墙都不匹配,您将收到无法找到路径“/login_check”的控制器异常。

当两个操作使用相同的 URL 时,这有点棘手,但这是可能的。 最大的障碍是您无法通过 http 方法匹配防火墙。 然后,您需要做的第一件事是通过删除任何专门匹配登录路由的防火墙,确保两个登录路由都只匹配您的主防火墙。

在上面的示例中,这意味着从security.yml 中删除此部分:

    login:
        pattern:  ^/login$
        security: false

这将满足login_check匹配您正在使用的防火墙的第一个要求,但未经身份验证的用户将无法再访问登录路由! 这会导致重定向循环。 幸运的是,有办法解决这个问题。 在您的security.yml文件中,在防火墙部分下方,您应该看到一个名为access_control的部分。 (如果没有,请制作一个。)您需要将以下行添加到本节的顶部 (同样,Symfony 匹配是保守的,一旦找到第一个匹配就退出。)

access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [GET] }

这将明确允许匿名用户访问 /login 路径,但只能通过 GET。

这是我的配置,仅在 Symfony 3.1 中使用/login路由:

文件security.yml

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/login$
        security: false
        methods: [GET]

    main:
        pattern:    ^/
        form_login:
            login_path: login #this use the route name and not the pattern
            check_path: login_check # same here : route name
        logout:
            path: logout

access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, methods: [GET] }
    - { path: ^/, roles: ROLE_USER}

文件routing.yml

login_check:
    path: /login
    methods: [POST]
logout:
    path: /logout

控制器:

/**
 * @Route("/login", name="login")
 * @Method({"GET"})
 */
public function loginAction(Request $request)
{

这对我有用:

  • /login with GET 给了我控制器。
  • /login 使用 POST 提交表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM