[英]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 }
页面架构:
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.