[英]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)
{
这对我有用:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.