繁体   English   中英

Symfony3登录表单:如何在security.yml中设置防火墙参数?

[英]Symfony3 Login form : how to parametrize firewall in security.yml?

我的项目是一个完全私有的界面,用户必须登录才能进入。 我尝试建立登录表单。 因此,我的体系结构中不需要/ admin /文件夹。

我遵循Symfony的指示来构建传统的登录表单。

当我尝试获取主页(或另一个)时,它将重定向到登录表单。 至此,一切正常。

但是我的问题是我的登录页面上有一个重定向循环。 当我尝试登录时,它每次都会在登录页面(而不是我们尝试查看的页面)上重定向。

我认为security.yml文件中存在防火墙配置级别的问题。

安全性

首先,我想用一个简单的用户测试我的登录表单,但是至少,我会将用户存储在数据库中。 这只是为了测试。

除了登录页面外,安全区域是我的整个界面,这就是为什么我设置了登录防火墙(正是Symfony的建议 )。

security:
    providers:
        in_memory:
            memory:
               users:
                  mylogin:
                     password: mypwd
                     roles: 'ROLE_ADMIN'

    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

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

        login_firewall:
            pattern:   ^/login$
            anonymous: ~

        secured_area:
            pattern:   ^/
            provider: in_memory
            form_login:
                login_path: login
                check_path: login

                # csrf token options
                csrf_parameter:       _csrf_token
                csrf_token_id:        authenticate
                csrf_token_generator: security.csrf.token_manager

            logout:
                path:   /logout
                target: /

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_ADMIN }

页面架构:

  • /default/index.html.twig
  • /security/login.html.twig

routing.yml

login:
    path: /login
    defaults: { _controller: AppBundle:Security:login }

logout:
    path: /logout

SecurityController.php

<?php

namespace AppBundle\Controller;

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

class SecurityController extends Controller
{
   /**
   * @Route("/login", name="login")
   */
   public function loginAction(Request $request)
   {

      $authenticationUtils = $this->get('security.authentication_utils');

      // get the login error if there is one
      $error = $authenticationUtils->getLastAuthenticationError();

      // last username entered by the user
      $lastUsername = $authenticationUtils->getLastUsername();

      return $this->render(
         'security/login.html.twig',
         array(
            'last_username' => $lastUsername,
            'error'         => $error,
         )
      );
   }
}

我哪里错了? 我不明白为什么我的表单上有一个重定向循环。 而且,当我输入假的登录名和密码时,Symfony不会显示错误,应该这样做:

login.html.twig

{% if error %}
     <p class="bg-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</p>
{% endif %}

我需要建议,请帮助我;-)谢谢!

嗨@Felurian,您的check_path必须在防火墙后面。

对于您的防火墙,您应该更改

    main:
        pattern:    ^/
        anonymous: false


          form_login:
            login_path: /login
            check_path: /login_check

access_control:
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

由于有了这个线程 ,我找到了一个对我有用的解决方案。

奇怪的是,即使我们希望将其设为私有,也必须在主防火墙中放入“ anonymous:〜”。

现在,当我尝试访问主页时,它会重定向到我的登录表单。 当我登录时,用户通过身份验证,然后重定向到主页。

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

        main:
            pattern:   ^/
            provider: in_memory
            anonymous: ~
            form_login:
                login_path: /login
                check_path: /login

                # csrf token options
                csrf_parameter:       _csrf_token
                csrf_token_id:        authenticate
                csrf_token_generator: security.csrf.token_manager

            logout:
                path:   /logout
                target: /

    access_control:
        - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_ADMIN }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM