我刚刚在这个论坛的帮助下添加了 AuthenticationSuccessHandler,当用户通过 fosuserbundle 或 fosfacebookbundle 登录时,它在我的网站上实现重定向。当用户是否完成配置文件时,重定向会发生变化,如果已完成,我希望将它们重定向到之前的位置,这就是我使用引用变量的原因。
命名空间 Me\MyBundle\Handler;
使用 Symfony\Component\Security\Http\HttpUtils;
使用 Symfony\Component\HttpFoundation\RedirectResponse;
使用 Symfony\Component\HttpFoundation\Request;
使用 Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
使用 Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
类 AuthenticationSuccessHandler 扩展 DefaultAuthenticationSuccessHandler {
受保护的$router;
公共函数 __construct( HttpUtils $httpUtils, 数组 $options, $router) {
$这个->路由器=$路由器;
父::__construct( $httpUtils, $options );
}
公共函数 onAuthenticationSuccess( 请求 $request, TokenInterface $token ) {
$user = $token->getUser();
if($user->getProfileComplete()!=1){
//重定向到配置文件编辑
$url = 'fos_user_profile_edit';
}别的{
$referer = $request->headers->get('referer');
if($referer == NULL){
//如果没有任何referer则重定向到自定义url
$url = 'My_customurl';
}别的{
//重定向到引用者
$url = $referer;
}
}
return new RedirectResponse($this->router->generate($url));
}
}
my security.yml note …
我将FOSUserBundle的注册表格覆盖了附加字段:它运作良好.
当我应用相同的逻辑来覆盖配置文件表单时:表单显示我的附加字段,但都是空的(字段不包含已连接用户的值).
注意:当我使用捆绑包中的默认表单时,配置文件表单包含已连接用户的值.
是否有比较覆盖注册表单以检索已连接用户的值的特定操作?
这是代码:
services:
...
vn_user.profile.form.type:
class: Vn\UserBundle\Form\Type\ProfileFormType
arguments: [%fos_user.model.user.class%]
tags:
- { name: form.type, alias: vn_user_profile }
vn_user.form.handler.profile:
class: Vn\UserBundle\Form\Handler\ProfileFormHandler
arguments: ["@fos_user.profile.form", "@request", "@fos_user.user_manager"]
scope: request
public: false
Run Code Online (Sandbox Code Playgroud)
fos_user:
...
profile:
form:
type: vn_user_profile
handler: vn_user.form.handler.profile
Run Code Online (Sandbox Code Playgroud)
namespace Vn\UserBundle\Form\Type;
use Symfony\Component\Form\FormBuilder;
use FOS\UserBundle\Form\Type\ProfileFormType as BaseType;
class ProfileFormType extends BaseType
{
public function buildUserForm(FormBuilder $builder, array $options)
{
parent::buildUserForm($builder, $options);
// custom field
$builder->add('profile',new MyProfileFormType(),array(
'label' => 'PROFILE'
));
}
public …Run Code Online (Sandbox Code Playgroud) 当我尝试安装FOSUserBundle时,我收到以下错误:
Fatal error: Call to undefined method Symfony\Bundle\DoctrineBundle\Registry::getManager() in W:\symproject\app\cache\dev\appDevDebugProjectContainer.php on line 1039
Run Code Online (Sandbox Code Playgroud)
它能是什么?
我还尝试将FOSUserBundle安装到纯粹的Symfony Standart Edition并遇到了同样的问题.
我按照这个文档.
我几天前在这里发布了一个问题: FOSUserBundle:嵌入登录表单并选择其模板
但它非常复杂,我认为在这个问题背后,可能存在一个简单的路由问题,所以我认为创建一个并行主题,删除我所做的所有修改,并从全新的安装开始是一个好主意.
所以,我安装了FOSUserBundle,我有一个WelcomeBundle,它包含了我网站的几个页面,我还创建了一个新的UserBundle,它只包含FOSUserBundle的用户实体,没有别的(没有任何覆盖).
在我的rsWelcomeBundle中,在我的index.html.twig中,我把这个简单的代码:
{% extends "rsWelcomeBundle::layout.html.twig" %}
{% block title "Page d'accueil" %}
{% block body %}
<div class="span6">
<div class="well">
<h2>Présentation du jeu</h2>
<a href="{{ path('rsWelcomeBundle_homepage_inscription') }}" class="btn ">Je m'inscris !</a></p>
</div>
</div>
<div class="span6">
<div class="well">
{% render "FOSUserBundle:Security:login" %}
</div>
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我总是有这个错误:
在rsWelcomeBundle:Homepage:index.html.twig第1行的模板渲染过程中抛出异常("找不到"GET Security:login""的路径).
如果我将这一行放在渲染部分,它就能正常工作.
{% render(controller("FOSUserBundle:Security:login")) %}
Run Code Online (Sandbox Code Playgroud)
但为什么 ??在文档中我从未看到我们要使用"渲染(控制器".为什么我不能直接使用:渲染"FOSUserBundle:安全:登录"?
在app/config/routing.yml我有:
tuto_welcome:
resource: "@rsWelcomeBundle/Resources/config/routing.yml"
prefix: /
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /profile
fos_user_register:
resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
prefix: /register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml" …Run Code Online (Sandbox Code Playgroud) 我正在努力为这个问题找到一个可重用但不是硬编码的解决方案.
在我的注册页面上,我要求尽可能少的信息让用户注册.完成该步骤后,将创建一个用户.
在他们可以使用应用程序的其他部分之前,我希望他们完成他们的个人资料.(我知道这可能更好,使这个可选,但对于这个用例,它是强制性的).
我们在注册时已将标志profileComplete设置为false但我觉得在每个控制器中执行此标记检查是强制执行配置文件完成的一种不好的方法.
Symfony中是否有更多OO方式使用EventSubscriber或自定义角色(USER_PENDING)来解决此问题?如何为该角色设置额外的防火墙?
我想在用户点击注册链接后重定向我的用户但是因为没有setResponse方法而被卡住了FilterUserResponseEvent
RegistrationListenner.php
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegistrationConfirmed',
);
}
public function onRegistrationConfirmed(FilterUserResponseEvent $event)
{
$url = $this->router->generate('my_route', array('foo' => 'bar'));
$response = new RedirectResponse($url);
$event->setResponse(new RedirectResponse($url));
}
Run Code Online (Sandbox Code Playgroud)
的services.xml
<service id="myapp.profile" class="MyApp\UserBundle\EventListener\ProfileListener">
<tag name="kernel.event_subscriber"/>
<argument type="service" id="router" />
</service>
Run Code Online (Sandbox Code Playgroud) 我有FOSUserBundle来管理我的用户,而SonataAdminBundle来管理我的网站......我有一个问题,每当我尝试更改/添加密码给任何用户时,密码都没有被编码sha512,但是当用户注册时它会本身在fosuserbundle注册页面内...
因此Symfony2配置既没有fosuserbundle配置也没有任何问题,它可能在某个地方的SonataAdminBundle内部,或者可能在我的管理类中...
<?php
// src/Acme/DemoBundle/Admin/PostAdmin.php
namespace Web\DificilBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Web;
class UserAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('firstname')
->add('lastname')
->add('username')
->add('email')
->add('password', 'password') // -> I WANT THIS TO BE ENCODED INTO SHA512!
->add('roles','choice',array('choices'=>$this->getConfigurationPool()->getContainer()->getParameter('security.role_hierarchy.roles'),'multiple'=>true ));
//->add('body')
;
}
// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('firstname')
->add('lastname')
->add('username')
->add('email')
->add('password')
;
} …Run Code Online (Sandbox Code Playgroud) 登录到Symfony2应用程序时出现以下错误:
[2014-06-27 00:36:22] security.INFO:身份验证请求失败:无效的CSRF令牌.[] []
运行:
相同的设置是在Ubuntu主机系统上工作.
谢谢你的帮助.
security.yml:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: fos_user_security_login
check_path: fos_user_security_check
logout:
invalidate_session : false
path: fos_user_security_logout
anonymous: true
switch_user: true
Run Code Online (Sandbox Code Playgroud)
应用程序/索纳塔/ UserBundle /资源/视图/安全/ login.html.twig
{% extends "FOSUserBundle::layout.html.twig" %}
{% trans_default_domain 'FOSUserBundle' %}
{% block fos_user_content %}
{% if error %}
<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ error|trans }}
</div>
{% endif %}
<form class="form-horizontal" action="{{ path("fos_user_security_check") …Run Code Online (Sandbox Code Playgroud) 我遇到了FOSUserBundle的问题,因为每次我使用错误的凭据登录时,我都会得到完整的堆栈跟踪作为错误消息:
错误!异常'Symfony\Component\Security\Core\Exception\BadCredentialsException',在/ var/www/html/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider中显示消息'bad credentials'. PHP:90
这对我来说很难看,所以对用户来说非常难看.所以我正在考虑两个解决方案:改为AJAX登录,我正在努力,但它没有工作或我做错了(将在下面解释)并找到一种方法来改变那个丑陋的消息(我没有得到这个,所以任何建议都会有所帮助).
现在关于第一个解决方案,这就是我所做的:
实现AuthenticationHandler:
<?php
namespace UsuarioBundle\Handler;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
class AuthenticationHandler
implements AuthenticationSuccessHandlerInterface,
AuthenticationFailureHandlerInterface
{
private $router;
public function __construct(Router $router)
{
$this->router = $router;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
if ($request->isXmlHttpRequest()) {
// do I need something here?
} else {
// If the user tried to access a protected resource and was forces to login …Run Code Online (Sandbox Code Playgroud)我正在使用SonataAdminBundle进行用户管理.我想改变用户的角色.目前我在configureFormFields方法中的代码是这样的,但角色永远不会更新,我不知道为什么.
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('General')
->add('roles', 'choice', array(
'choices' => array(
'ROLE_ADMIN' => 'ADMIN',
'ROLE_USER' => 'API USER',
),
'expanded' => false,
'multiple' => true,
'required' => false
))
->add('email')
->add('plainPassword', 'text', array('label' => 'Password', 'required' => false))
->end()
;
}
Run Code Online (Sandbox Code Playgroud) fosuserbundle ×10
symfony ×10
php ×3
sonata-admin ×2
ajax ×1
encryption ×1
login ×1
overriding ×1
profile ×1
routes ×1
security ×1