错误:找不到路径“/login_check”的控制器。路由配置错误。 (LexikJWTAuthentication)
Posted
技术标签:
【中文标题】错误:找不到路径“/login_check”的控制器。路由配置错误。 (LexikJWTAuthentication)【英文标题】:Error: Unable to find the controller for path "/login_check". The route is wrongly configured. (LexikJWTAuthentication) 【发布时间】:2019-06-21 18:42:36 【问题描述】:说明
当我对在http://localhost:8000/api/admin/login_check
上运行的 symfony 服务器发出正常请求时,它会返回所需的 jwt 令牌。
但是,当我使用功能测试(./bin/phpunit
)时,我收到以下错误:
错误:找不到路径 \"/api/admin/login_check\" 的控制器。路由配置错误。
我也通过functional test docs.
Bug Reproduced
不要犹豫,克隆或分叉这个项目进行测试。有 README.md 解释安装步骤。
我还可以通过克隆 lexikjwtauthenticationbundle 的创建者之一提供的工作示例来reproduce the bug。
日志
测试日志(错误)
在运行./bin/phpunit
时发生
[2019-01-31 09:37:49] request.INFO: Matched route "api_admin_login_check". "route":"api_admin_login_check","route_parameters":"_route":"api_admin_login_check","request_uri":"http://localhost/api/admin/login_check","method":"POST" []
[2019-01-31 09:37:49] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2019-01-31 09:37:49] request.WARNING: Unable to look for the controller as the "_controller" parameter is missing. [] []
开发日志(成功)
在执行 curl 或邮递员请求时发生
[2019-01-29 21:16:26] request.INFO: Matched route "api_admin_login_check". "route":"api_admin_login_check","route_parameters":"_route":"api_admin_login_check","request_uri":"https://localhost:8000/api/admin/login_check","method":"POST" []
[2019-01-29 21:16:27] doctrine.DEBUG: SELECT t0.id AS id_1, t0.email AS email_2, t0.password AS password_3 FROM admin t0 WHERE t0.email = ? LIMIT 1 ["email@test.com"] []
[2019-01-29 21:16:27] security.INFO: User has been authenticated successfully. "username":null []
相关代码:
测试方法:
public function testLogin()
$client = static::createClient();
$client->request('POST', '/api/admin/login_check', [], [],
[
'Content-Type' => 'application/json',
'Accept' => 'application/json'
],
json_encode([
'email' => 'email@test.com',
'password' => 'qwerty123'
])
);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
路线:
# Admin Routes
api_admin_login_check:
path: /api/admin/login_check
methods: [POST]
安全性:
security:
# more configs here
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_admin:
pattern: ^/api/admin/login
stateless: true
anonymous: true
json_login:
username_path: email
provider: app_admin_provider
check_path: /api/admin/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
admin_api:
pattern: ^/api/admin
stateless: true
provider: app_admin_provider
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- path: ^/api/admin/register, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/api/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/api/admin, roles: ROLE_ADMIN
- path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY
问题
为什么在功能测试期间有一个404 route not found
用于/api/admin/login_check
路由,但在 curl 和 postman 中可以正常工作?
Github #610
【问题讨论】:
你看过日志吗?var/logs/dev.log
在app/logs/dev.log
您是否将注册数据发送到登录检查?这没有任何意义。您应该将数据连同授权令牌一起发送到注册 url。如果您希望先获取令牌,请将 _username 和 _password 发送到上述登录检查。
@emix no 我正在将登录数据发送到 login_check。我已经在数据库中创建了一个用户。当我卷曲并使用邮递员检索令牌时,它工作正常。
【参考方案1】:
您的测试请求中的 content-type
标头名称错误。
它应该有名称CONTENT_TYPE
。
$client->request(
'POST',
'/login_check',
['_username' => 'lexik', '_password' => 'dummy'],
[],
['CONTENT_TYPE' => 'application/json']
);
检查在这里: 供应商/symfony/security/Http/Firewall/UsernamePasswordJsonAuthenticationListener.php::handle
if (false === strpos($request->getRequestFormat(), 'json')
&& false === strpos($request->getContentType(), 'json')
)
return;
它至少有助于您的“错误重现”代码。
【讨论】:
谢谢,不敢相信是这样的。【参考方案2】:确保/login_check
在防火墙后面
/login_check
路径必须与防火墙模式匹配。
改变这个
访问控制:
- 路径:^/your-route-for-login,角色:IS_AUTHENTICATED_ANONYMOUSLY,requires_channel:https
到
访问控制:
- 路径:^/your-route-for-login$,角色:IS_AUTHENTICATED_ANONYMOUSLY,requires_channel:https
我试过了:P
【讨论】:
其实这根本解决不了问题。它甚至在尝试访问控制器之前就抛出访问被拒绝。 你是否将它添加到防火墙模式和路径中......其次是***.com/questions/12409998/…。检查一下您的解决方案,我认为这会..只是想提供帮助:) 问题不是无法匹配正确的路由,而是找不到“控制器”。我的项目工作正常,但在用 phpunit 测试时却不行。我倾向于认为这是测试环境和 lexikjwtauthentication 侦听器的问题。【参考方案3】:经过几个不眠之夜,以下场景对我有用。
我最初在连接 Postman 时遇到问题,单击标题并将其更改为 Application/JSON 是不够的,因为我不断收到 ORM/Doctrine 错误。对我有用的是我在我的一个 PHP 类中使用了不推荐使用的函数。
我只是去我的日志文件 Var/log/dev.log 发现了这个错误:
php.CRITICAL:未捕获的错误:无法将 Doctrine\ORM\PersistentCollection 分配给 Doctrine\Common\Collections\ArrayCollection 类型的属性 Guess\Domain\Player\Player::$guesses
进一步的研究表明,我使用了已弃用 Collection 的 ArrayCollection 对象,因此将 ArrayCollection 更改为仅包含 getter 和 setter 方法的 Collection,然后重试。
这对我有用,我很高兴。
参考:Doctrine assignment error: Cannot assign Doctrine\ORM\PersistentCollection to property
这可能会在不久的将来帮助某人。
【讨论】:
以上是关于错误:找不到路径“/login_check”的控制器。路由配置错误。 (LexikJWTAuthentication)的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 3.3 找不到路径“/login/check”的控制器。路由配置错误
找不到静态图像的控制器路径? asp.net mvc 路由问题?
从另一个控制台应用程序运行控制台应用程序 c# 找不到错误文件