Symfony3表单登录仅适用于" main"防火墙

时间:2016-03-12 02:01:12

标签: php forms authentication symfony

我正在尝试为我的Symfony3网站构建自定义防火墙。我一直在关注documentation,并且能够让它适用于main防火墙。我想要的功能是用户使用Symfony的本机类使用他们的用户名和密码登录的能力。这是我的SecurityController

namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class SecurityController extends Controller
{
    /**
     * @Route("/m/login", name="model_login")
     */
    public function loginAction(Request $request)
    {
        $authenticationUtils = $this->get("security.authentication_utils");
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('Model/login.html.twig', [
            "error"     => $error,
            "lastUsername"  => $lastUsername
        ]);
    }
}

正如您所看到的,除了路由设置已更改之外,完全与示例代码相同。我的登录表单呈现得很好。我提交表单时没有错误,我将表单发布到这个确切的控制器。我的视图效果非常好,因为当我的安全设置在" main之下时,我能够进行身份验证。"这是我的security.yml

security:
    providers:
        in_memory:
            memory: ~
        doctrine_provider:
            entity:
                class: AppBundle:Model
                property: username

    encoders:
        AppBundle\Entity\Model:
            algorithm: bcrypt

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~

        model_area:
            anonymous: ~
            provider: doctrine_provider
            pattern: ^/m/
            form_login:
                login_path: model_login
                check_path: model_login
    access_control:
        - { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/m/, roles: ROLE_MODEL }

我的提供商和编码器功能正常,例如我在" main"防火墙。但是,当我尝试将我的设置置于" model_area,"提交我的表单只是将我重定向到登录表单,没有身份验证。我只添加了pattern: ^/m/- { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY },因此我不会阻止访问我的登录表单。其他一切都保持不变(甚至是路线名称!)。

我有一个路由/m/model_dashboard,它会抛出一个错误,说" 需要完全身份验证才能访问此资源。"很明显我的访问控制设置工作正常,但是当我尝试访问受保护资源时,它没有重定向到我的登录表单。

我有什么遗失的东西吗?我非常困惑的是,为什么身份验证在main下可以正常工作,但在我的自定义防火墙下却没有,后者具有相同的确切设置。

1 个答案:

答案 0 :(得分:2)

问题出在我的main防火墙上。我不知道防火墙的确定与路线类似,从上到下。每个请求都是在“主”防火墙(没有form_login)下提交的,这就是我的登录代码无效的原因。我删除了main防火墙,它运行得很漂亮。以下是我更新的security.yml现在的样子:

security:
    providers:
        in_memory:
            memory: ~
        doctrine_provider:
            entity:
                class: AppBundle:Model
                property: username

    encoders:
        AppBundle\Entity\Model:
            algorithm: bcrypt

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        model_area:
            anonymous: ~
            provider: doctrine_provider
            pattern: ^/m/
            form_login:
                login_path: model_login
                check_path: model_login
    access_control:
        - { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/m/, roles: ROLE_MODEL }