Symfony 3.2 "security.firewall.map.context.main" 依赖于不存在的服务^我的身份验证处理程序^
Symfony 3.2 "security.firewall.map.context.main" has a dependency on a non-existent service ^my authentication handler^
在我个人的 Symfony 3.2 项目中(https://github.com/pc-magas/photoalbum) because I wanted to get a Json instead of redirecting based on http://www.webtipblog.com/adding-an-ajax-login-form-to-a-symfony-project/ 我制作了以下身份验证管理器:
<?php
namespace AppBundle\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
private $router;
private $session;
/**
* Constructor
*
* @author Joe Sexton <joe@webtipblog.com>
* @param RouterInterface $router
* @param Session $session
*/
public function __construct( RouterInterface $router, Session $session )
{
$this->router = $router;
$this->session = $session;
}
/**
* onAuthenticationSuccess
*
* @author Joe Sexton <joe@webtipblog.com>
* @param Request $request
* @param TokenInterface $token
* @return Response
*/
public function onAuthenticationSuccess( Request $request, TokenInterface $token )
{
// if AJAX login
if ( $request->isXmlHttpRequest() ) {
$array = array( 'status' => true ); // data to return via JSON
$response = new Response( json_encode( $array ) );
$response->headers->set( 'Content-Type', 'application/json' );
return $response;
// if form login
} else {
if ( $this->session->get('_security.main.target_path' ) ) {
$url = $this->session->get( '_security.main.target_path' );
} else {
$url = $this->router->generate( 'home_page' );
} // end if
return new RedirectResponse( $url );
}
}
/**
* onAuthenticationFailure
*
* @author Joe Sexton <joe@webtipblog.com>
* @param Request $request
* @param AuthenticationException $exception
* @return Response
*/
public function onAuthenticationFailure( Request $request, AuthenticationException $exception )
{
// if AJAX login
if ( $request->isXmlHttpRequest() ) {
$array = array( 'status' => false, 'message' => $exception->getMessage() ); // data to return via JSON
$response = new Response( json_encode( $array ) );
$response->headers->set( 'Content-Type', 'application/json' );
return $response;
// if form login
} else {
// set authentication exception to session
$request->getSession()->set(SecurityContextInterface::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse( $this->router->generate( 'login_route' ) );
}
}
}
我这样配置 services.yml
:
parameters:
services:
authentication_handler:
class: AppBundle\Security\AuthenticationHandler
public: false
arguments: ["@router","@session"]
我这样配置 security.yml
:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
check_path: security_check_route
success_handler: authentication_handler
failure_handler: authentication_handler
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
但我收到以下错误:
The service "security.firewall.map.context.main" has a dependency on a non-existent service "authentication_handler".
您知道如何解决这个问题吗?我已将 authentication_handler
我的服务设置到 services.yml
文件中,但出现上述错误。
也许您搞不清楚 services.yml
中服务的定义方式。请检查空格和 yml 语法。
是的,您需要添加服务
在services.xml
<service id="app.security.authentication_handler" class="AppBundle\Security\AuthenticationHandler">
<argument type="service" id="router" />
<argument type="service" id="session" />
<argument type="service" id="doctrine.orm.entity_manager" />
</service>
或在services.yml
app.security.authentication_handler:
class: AppBundle\Security\AuthenticationHandler
arguments: ["@router", "@session", "@doctrine.orm.entity_manager" ]
在我个人的 Symfony 3.2 项目中(https://github.com/pc-magas/photoalbum) because I wanted to get a Json instead of redirecting based on http://www.webtipblog.com/adding-an-ajax-login-form-to-a-symfony-project/ 我制作了以下身份验证管理器:
<?php
namespace AppBundle\Security;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
class AuthenticationHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
private $router;
private $session;
/**
* Constructor
*
* @author Joe Sexton <joe@webtipblog.com>
* @param RouterInterface $router
* @param Session $session
*/
public function __construct( RouterInterface $router, Session $session )
{
$this->router = $router;
$this->session = $session;
}
/**
* onAuthenticationSuccess
*
* @author Joe Sexton <joe@webtipblog.com>
* @param Request $request
* @param TokenInterface $token
* @return Response
*/
public function onAuthenticationSuccess( Request $request, TokenInterface $token )
{
// if AJAX login
if ( $request->isXmlHttpRequest() ) {
$array = array( 'status' => true ); // data to return via JSON
$response = new Response( json_encode( $array ) );
$response->headers->set( 'Content-Type', 'application/json' );
return $response;
// if form login
} else {
if ( $this->session->get('_security.main.target_path' ) ) {
$url = $this->session->get( '_security.main.target_path' );
} else {
$url = $this->router->generate( 'home_page' );
} // end if
return new RedirectResponse( $url );
}
}
/**
* onAuthenticationFailure
*
* @author Joe Sexton <joe@webtipblog.com>
* @param Request $request
* @param AuthenticationException $exception
* @return Response
*/
public function onAuthenticationFailure( Request $request, AuthenticationException $exception )
{
// if AJAX login
if ( $request->isXmlHttpRequest() ) {
$array = array( 'status' => false, 'message' => $exception->getMessage() ); // data to return via JSON
$response = new Response( json_encode( $array ) );
$response->headers->set( 'Content-Type', 'application/json' );
return $response;
// if form login
} else {
// set authentication exception to session
$request->getSession()->set(SecurityContextInterface::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse( $this->router->generate( 'login_route' ) );
}
}
}
我这样配置 services.yml
:
parameters:
services:
authentication_handler:
class: AppBundle\Security\AuthenticationHandler
public: false
arguments: ["@router","@session"]
我这样配置 security.yml
:
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
check_path: security_check_route
success_handler: authentication_handler
failure_handler: authentication_handler
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
但我收到以下错误:
The service "security.firewall.map.context.main" has a dependency on a non-existent service "authentication_handler".
您知道如何解决这个问题吗?我已将 authentication_handler
我的服务设置到 services.yml
文件中,但出现上述错误。
也许您搞不清楚 services.yml
中服务的定义方式。请检查空格和 yml 语法。
是的,您需要添加服务
在services.xml
<service id="app.security.authentication_handler" class="AppBundle\Security\AuthenticationHandler">
<argument type="service" id="router" />
<argument type="service" id="session" />
<argument type="service" id="doctrine.orm.entity_manager" />
</service>
或在services.yml
app.security.authentication_handler:
class: AppBundle\Security\AuthenticationHandler
arguments: ["@router", "@session", "@doctrine.orm.entity_manager" ]