Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony,如何在没有任何提供者的情况下创建防火墙身份验证程序_Php_Security_Symfony - Fatal编程技术网

Php Symfony,如何在没有任何提供者的情况下创建防火墙身份验证程序

Php Symfony,如何在没有任何提供者的情况下创建防火墙身份验证程序,php,security,symfony,Php,Security,Symfony,我只想有一个过滤请求的服务(我没有令牌,没有用户,也没有数据库,等等) 例如,如果它包含值为“yyyy”的标题“xxxxx”,则请求将继续发送给控制器,如果不是,则应返回401响应 我可以使用该服务创建一个侦听器,并将其订阅到“kernel.controller”事件,并验证最后提到的规则 但我想知道是否可以使用安全捆绑包实现这一点,它只允许我将其应用于所需的URL等,只需将SecurityListenerFactory添加到securityContainer: /** * Class App

我只想有一个过滤请求的服务(我没有令牌,没有用户,也没有数据库,等等)

例如,如果它包含值为“yyyy”的标题“xxxxx”,则请求将继续发送给控制器,如果不是,则应返回401响应

我可以使用该服务创建一个侦听器,并将其订阅到“kernel.controller”事件,并验证最后提到的规则


但我想知道是否可以使用安全捆绑包实现这一点,它只允许我将其应用于所需的URL等,只需将SecurityListenerFactory添加到securityContainer:

/**
 * Class AppBundle
 *
 * @package AppBundle
 */
class AppBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container); 

        $extension = $container->getExtension('security');
        $extension->addSecurityListenerFactory(new MySecurityFactory());
    }
}
创建自定义安全工厂:

/**
 * Class MySecurityFactory
 *
 * @package AppBundle\DependencyInjection\Security\Factory
 */
class MySecurityFactory implements SecurityFactoryInterface
{
    /**
     * @param ContainerBuilder $container
     * @param string           $id
     * @param array            $config
     * @param string           $userProvider
     * @param string           $defaultEntryPoint
     *
     * @return array
     */
    public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
    {
        $listenerId = 'security.listener.'.$id;
        $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.listener.'));

        return array($providerId, $listenerId, $defaultEntryPoint);
    }

    /**
     * @return string
     */
    public function getPosition()
    {
        return 'pre_auth';
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return 'my_secret';
    }

    /**
     * @param NodeDefinition $node
     */
    public function addConfiguration(NodeDefinition $node)
    {
    }
}
并创建自定义侦听器:

/**
 * Class MySecurityListener
 *
 * @package AppBundle\Security\Firewall
 */
class MySecurityListener
{
    /**
     * @param GetResponseEvent $event
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        try {
            // do things you like
        } catch (AuthenticationException $failed) {
            // ... you might log something here
        }

        // By default deny authorization
        $response = new Response();
        $response->setStatusCode(Response::HTTP_FORBIDDEN);
        $event->setResponse($response);
    }
}
但我建议使用预授权标记或类似标记


希望这能有所帮助。

听起来像某种API类型的身份验证——我可以发誓,在Symfony2文档中,可能是烹饪书中,也有类似的例子。不管怎样,读一读关于安全选民的书,这可能会对你有所帮助。