当为管理员用户提供后端时,有一个登录表单很有意思,同时在我们网站的公共区域为普通用户提供正常的登录表单。
使用FOSUserBundle可以吗?如何以“Symfony2”的方式完成?
答案 0 :(得分:24)
首先,我们需要为管理区域配置一些特殊路由:
admin_login:
pattern: /admin/login
defaults: { _controller: FOSUserBundle:Security:login }
admin_login_check:
pattern: /admin/login_check
defaults: { _controller: FOSUserBundle:Security:check }
admin_logout:
pattern: /admin/logout
defaults: { _controller: FOSUserBundle:Security:logout }
接下来使用这些路由为管理区域配置一个特殊防火墙,并定义它们以匿名方式访问:
firewalls:
...
admin:
pattern: /admin/(.*)
form_login:
provider: fos_userbundle
login_path: admin_login
check_path: admin_login_check
default_target_path: yourproject_admin_default_index
logout:
path: admin_logout
target: admin_login
anonymous: true
context: application
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
context: application
...
access_control:
...
- { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
确定!我们刚刚将登录系统分为两部分:admin和main。
让我们覆盖SecurityController。为此,我们需要创建一个父类为FOSUserBundle的自定义包(请检查文档)。在这个新包中,创建控制器:
<?php
namespace YourProject\UserBundle\Controller;
use FOS\UserBundle\Controller\SecurityController as BaseController;
/**
* {@inheritDoc}
*/
class SecurityController extends BaseController
{
/**
* {@inheritDoc}
*/
public function renderLogin(array $data)
{
$requestAttributes = $this->container->get('request')->attributes;
if ('admin_login' === $requestAttributes->get('_route')) {
$template = sprintf('AdminBundle:Security:login.html.twig');
} else {
$template = sprintf('FOSUserBundle:Security:login.html.twig');
}
return $this->container->get('templating')->renderResponse($template, $data);
}
}
就是这样!现在您可以编写AdminBundle:Security:login.html.twig:)
注意:不要忘记在管理区域使用管理员路线! (在登录表单操作,注销链接等)
答案 1 :(得分:1)
关于批准的答案,我在Symfony 3.2.8项目中做了一些调整才能正常工作。
而不是SELECT @columns = stuff((select DISTINCT ',' +
quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ')
)
from
(select distinct action_note engagement_action where action_note is not null)
n, action_party m, personal p
where n.action_id = m.action_id
and p.party_id = m.party_id
and n.action_note like 'XXX'
and m.system_name = 'XXXXXXXXXXXX'
and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'')
在安全控制器中,我使用了$requestAttributes = $this->container->get('request')->attributes;
。