[英]How to solve ServiceNotFoundException in Symfony3
錯誤
ServiceNotFoundException in CheckExceptionOnInvalidReferenceBehaviorPass.php
The service "token_authenticator" has a dependency on a non-existent service "lexik_jwt_authentication.jwt_encoder".
我需要的
config.yml
lexik_jwt_authentication:
private_key_path: '%kernel.root_dir%/../var/jwt/private.pem'
public_key_path: '%kernel.root_dir%/../var/jwt/public.pem'
pass_phrase: '%jwt_key_pass_phrase%'
token_ttl: 3600
security.yml
firewalls:
main:
pattern: ^/
logout: true
anonymous: true
stateless: true
guard:
authenticators:
- 'token_authenticator'
services.yml
services:
token_authenticator:
class: AcmeStoreBundle\Security\TokenAuthenticator
arguments: ['@lexik_jwt_authentication.jwt_encoder', '@doctrine_mongodb']
使用routing.yml
acme_store_login_user:
type: rest
path: /login_check
defaults: { _controller: AcmeStoreBundle:Login:login }
name_prefix: api_
登錄控制器代碼
public function loginAction(Request $request) {
$data = json_decode(file_get_contents('php://input'), true);
$userName = $data['username'];
$password = $data['password'];
$user = $this->get('doctrine_mongodb')
->getRepository('AcmeStoreBundle:User')
->findOneBy(['username' => $userName]);
if (!$user) {
throw $this->createNotFoundException();
}
$isValid = $this->get('security.password_encoder')
->isPasswordValid($user, $password);
if (!$isValid) {
throw new BadCredentialsException();
}
$response = new Response(Response::HTTP_OK);
$token = $this->getToken($user);
$response = new Response($this->serialize(['token' => $token]), Response::HTTP_OK);
return $this->setBaseHeaders($response);
}
public function serialize($data) {
$context = new SerializationContext();
$context->setSerializeNull(true);
return $this->get('jms_serializer')
->serialize($data, 'json', $context);
}
public function getToken(User $user) {
return $this->container->get('lexik_jwt_authentication.encoder')
->encode([
'username' => $user->getUsername(),
'exp' => time() + 3600 ,
]);
}
refrence:
https://github.com/chalasr/lexik-jwt-authentication-sandbox https://knpuniversity.com/screencast/symfony-rest4/create-json-web-token#play
您正在使用2.x版本,(從更改日志中可以看到) lexik_jwt_authentication.jwt_encoder
服務(從1.x版本開始)。 您應該使用lexik_jwt_authentication.encoder.default
:
已刪除服務lexik_jwt_authentication.jwt_encoder,轉而使用支持OpenSSL和phpseclib加密引擎的lexik_jwt_authentication.encoder.default。
token_authenticator:
class: Acme\StoreBundle\Security\TokenAuthenticator
arguments: ['@lexik_jwt_authentication.encoder.default', '@doctrine_mongodb']
我在Symfony 4中遇到了同樣的問題,因為我的LoginConroller擴展了BaseController,因此請確保您的LoginController擴展了Controller Class 。 像這樣 :
class LoginController extends Controller {
.......
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.