更改symfony2 login_check URL

Nos*_*nit 5 php symfony

我正在根据一套规范实现Symfony2解决方案.规范声明GET/login的登录表单必须重新发送到POST/login

有谁知道如何更改/ login_check的URL?我可以创建一个直接调用安全控制器的路由吗?我在安全捆绑包中看不到任何控制器.

oft_auth_login:
    pattern: /login
    defaults: { _controller: MagicSecurityBundle:Default:login_check }
    methods: [POST]
Run Code Online (Sandbox Code Playgroud)

根据security.yml的文档,

check_path(type:string,default:/ login_check)这是您的登录表单必须提交的路径或路径.防火墙将拦截任何请求(默认情况下仅POST请求)到此URL并处理提交的登录凭据.

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

我将其更改为POST/login,但它说它无法找到它......

编辑5月30日:

现在我有一个看起来像这样的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 
Run Code Online (Sandbox Code Playgroud)

和一个如下所示的routing.yml:

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

oft_auth_login_check:
    pattern: /login
    methods: [POST]
Run Code Online (Sandbox Code Playgroud)

我可以加载的形式罚款(GET /登录),并在窗体的方法是POST,动作/登录,但是当我提出它,我得到以下错误(404,路线没有找到)

无法找到路径"/ login"的控制器.也许您忘了在路由配置中添加匹配路由?找不到404 - NotFoundHttpException

有没有人知道我需要调用什么代码/防火墙方法/以自定义check_login方法验证用户,或任何其他方式来完成我正在尝试做的事情,即访问并将登录表单发布到相同的URL(/ login).

先谢谢你,山姆

Kal*_*dor 1

在您的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
Run Code Online (Sandbox Code Playgroud)

在你的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
Run Code Online (Sandbox Code Playgroud)

将 security.yml更改check_path: /login_checkcheck_path: /new_login_check

将routing.yml更改pattern: /login_checkpattern: /new_login_check

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

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

<form action="{{ path('login_check') }}" method="post" class="form-horizontal">
Run Code Online (Sandbox Code Playgroud)

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

<form action="{{ path('login_check') }}" method="post" class="form-horizontal">
Run Code Online (Sandbox Code Playgroud)

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

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

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

执行上述操作后,您的routing.yml可能包含类似以下内容:

route_identifier:
    pattern: /relative/url/path
    defaults: {_controller: ExampleBundle:Example:test}
Run Code Online (Sandbox Code Playgroud)

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

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

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

login_check:
    pattern:   /login

logout:
    pattern: /logout
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅有关路由的 Symfony 文档。

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

来自 Symfony 的文档:

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

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

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

## 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
Run Code Online (Sandbox Code Playgroud)

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

    login:
        pattern:  ^/login$
        security: false
Run Code Online (Sandbox Code Playgroud)

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