Symfony 创建两个不同的登录(模板和重定向)
我需要创建一个网站的移动版本。因为他们的行为方式不同。我将创建不同的控制器来分离手机/电脑代码。但我不知道如何创建两种不同的登录模板和重定向 我需要创建另一个登录页面以应用不同的设计,如果用户成功登录,则会重定向到domain.com/mobile。如果用户出错,他将重定向到domain.com/mobile/login,而不是domain.com/login 我现在不知道该怎么做。什么是简单的方法 编辑我的防火墙:Symfony 创建两个不同的登录(模板和重定向),symfony,Symfony,我需要创建一个网站的移动版本。因为他们的行为方式不同。我将创建不同的控制器来分离手机/电脑代码。但我不知道如何创建两种不同的登录模板和重定向 我需要创建另一个登录页面以应用不同的设计,如果用户成功登录,则会重定向到domain.com/mobile。如果用户出错,他将重定向到domain.com/mobile/login,而不是domain.com/login 我现在不知道该怎么做。什么是简单的方法 编辑我的防火墙: firewalls: dev: pattern: ^
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: login
check_path: login_check
default_target_path: /
logout: true
anonymous: true
switch_user: true
remember_me:
key: "%secret%"
lifetime: 31536000
path: /
domain: ~
mobile:
pattern: ^/m/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: mobile_login
check_path: mobile_login_check
default_target_path: /m/
logout: true
anonymous: true
switch_user: true
remember_me:
key: "%secret%"
lifetime: 31536000
path: /m/
domain: ~
解决方案
这是我的解决方案,不确定这是否是最佳解决方案
security.yml
添加一个防火墙,在这里移动
mobile:
pattern: ^/m
anonymous: ~
form_login:
check_path: /m/login_check
login_path: /m/login
default_target_path: /m
logout:
path: /m/logout
target: /
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
switch_user: true
remember_me:
key: "%secret%"
lifetime: 31536000
path: /
domain: ~
routing.yml
添加路线
mobile_login:
pattern: /m/login
defaults: { _controller: AcmeUserBundle:Mobile:login }
mobile_check_special:
pattern: /m/login_check
mobile_logout_special:
pattern: /m/logout
Acme/UserBundle/MobileController.php
我只是从FOSUserBundle中c/c登录页面
<?php
namespace Acme\UserBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContext;
class MobileController extends Controller
{
public function loginAction(Request $request)
{
/** @var $session \Symfony\Component\HttpFoundation\Session\Session */
$session = $request->getSession();
// get the error if any (works with forward and redirect -- see below)
if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
} elseif (null !== $session && $session->has(SecurityContext::AUTHENTICATION_ERROR)) {
$error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
$session->remove(SecurityContext::AUTHENTICATION_ERROR);
} else {
$error = '';
}
if ($error) {
// TODO: this is a potential security risk (see http://trac.symfony-project.org/ticket/9523)
$error = $error->getMessage();
}
// last username entered by the user
$lastUsername = (null === $session) ? '' : $session->get(SecurityContext::LAST_USERNAME);
$csrfToken = $this->container->has('form.csrf_provider')
? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')
: null;
return $this->render('AcmeUserBundle:Mobile:login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
'csrf_token' => $csrfToken,
));
}
完成!已经测试过了,但是当我尝试获取/m/时得到了403,并且解决方案不完整。
<form action="{{ path("mobile_check_special") }}" method="post">
{% if error %}
<div class="errors">{{ error|trans([], 'FOSUserBundle') }}</div>
{% endif %}
<div class="row">
<label>Email :</label>
<input type="text" id="user" placeholder="E-mail" name="_username" value="{{ last_username }}" required="required">
</div>
<div class="row">
<label>Mot de passe :</label>
<input type="password" id="password" placeholder="Mot de passe" name="_password" required="required">
</div>
<div class="row">
<input type="hidden" name="_csrf_token" value="{{ csrf_token }}">
<input type="checkbox" checked="checked" style="display:none;" id="remember_me" name="_remember_me" value="on">
<button class="btn">Connexion</button>
</div>
</form>