所以我正在开发一个具有多个客户端的应用程序.在每种情况下,用户可以访问具有不同角色的多个客户端.例如,用户A具有ROLE_XX用于客户端C1,但ROLE_YY为客户端C2.
据我所知,FosUserBundle将用户的角色存储在列角色(默认表fos_user)中,因此该结构不适合我的需要.
我已经阅读了与角色管理相关的文档,但没有任何相关内容,所以我猜这是超出FosUserBundle范围的功能?
所以我在考虑创建一个与它们相关的附加表(客户端,用户,角色),但由于我根本不是FOS专家,所以我真的不知道这是否是正确的方法.或者也许我错过了什么.任何提示表示赞赏!
我正在使用FOSUserBundle,我正在尝试创建一个允许用户更新其用户配置文件的页面.我面临的问题是,如果用户不想更改/更新密码,我的表单不需要用户重新输入密码.因此,当用户使用空密码提交表单时,数据库将使用空字符串进行更新,并且用户将无法登录.
如果未设置密码字段,如何让我的表单忽略更新密码字段?以下是我正在使用的代码.
$user = $this->get('security.context')->getToken()->getUser();
//user form has email and repeating password fields
$userForm = $this->createForm(new UserFormType(), $user);
if ($request->getMethod() == 'POST') {
$userForm->bindRequest($request);
if($userForm->isValid()){
//this will be be empty string in the database if the user does not enter a password
$user->setPlainPassword($userForm->getData()->getPassword());
$em->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了一些如下所示的东西,但这仍然是空的,因为bindRequest将空密码设置为用户
if($userForm->getData()->getPassword())
$user->setPlainPassword($userForm->getData()->getPassword());
Run Code Online (Sandbox Code Playgroud)
我也尝试过,但这会导致类似的情况并导致不必要的查询
if($userForm->getData()->getPassword())
$user->setPlainPassword($userForm->getData()->getPassword());
else
$user->setPlainPassword($user->getPlainPassword());
Run Code Online (Sandbox Code Playgroud)
有没有优雅的方法来处理这个用例?
我正在使用SonataAdminBundle和SonataUserBundle.
SonataUserBundle注册SonataAdminBundle sonata.user.admin.group自动检测的服务,以设置管理仪表板中的链接以对CRUD操作进行分组.
我怎么禁用sonata.user.admin.group?我一直在Symfony2文档中遵循这些配方:
到目前为止,我在bundle定义中有以下代码来添加编译器传递:
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new CompilerPass());
}
Run Code Online (Sandbox Code Playgroud)
这里是编译器传递:
<?php
namespace NS\Service\CompilerPass;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class CompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->removeDefinition('sonata.user.admin.group');
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这应该有效但不行.Symfony正在抛出异常,告诉我sonata.user.admin.group服务不存在.但它存在,如果我这样做$container->getDefinition('sonata.user.admin.group'),实际的定义是返回.
谢谢
我正在使用Symfony 2.3 RC1设置FOSUserBundle dev-master,但翻译效果不佳.默认情况下,模板中包含trans_default_domain
在登录模板中.它不适用于trans_default_domain
{% trans_default_domain "FOSUserBundle" %}
<label class="control-label" for="username">{{ 'security.login.username'|trans }}</label>
Run Code Online (Sandbox Code Playgroud)
但使用trans({},'FOSUserBundle')它的工作原理
<label class="control-label" for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label>
Run Code Online (Sandbox Code Playgroud)
trans_default_domain有什么问题?需要任何额外的配置?
我希望通过FOSUserBundle登录来保护整个站点.我试着像这样设置security.yml
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_manager
firewalls:
main:
pattern: ^/
form_login:
check_path: /login_check
login_path: /login
provider: fos_userbundle
always_use_default_target_path: true
default_target_path: /dashboard
logout:
path: /logout
target: /
anonymous: ~
#http_basic:
# realm: "Secured Demo Area"
access_control:
- { path: ^/demo/secured/hello/admin/, roles: ROLE_ADMIN }
#- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
Run Code Online (Sandbox Code Playgroud)
但后来我不知道在config.yml中设置什么,这是我的config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
framework:
#esi: ~
translator: ~ …Run Code Online (Sandbox Code Playgroud) 我怀疑如何解决这个问题:
我的这个问题的Symfony2应用程序有两个不同的配置文件,名为'em"Seller"和"Buyer".目标是保留一堆关于"卖方"的属性,另一方面,关于"买方"(电子邮件和密码会做到这一点)并不多.
我意识到让两个不同的实体登录并使用FOSUserBundle进行注册并不容易.还有一些其他的捆绑包,例如PUGXMultiUserBundle,它们"破解"FOSUserBundle,并且不容易配置/实现.
所以我的问题是:使用黑客PUGXMultiUserBundle建议,处理它的实现和配置是否更正确,或者更好地坚持FOSUserBundle,拥有用户实体,以及与"卖方"的一对一关系代表卖方与买方不同的属性的实体?这种方法会有另一个问题,即注册表格应该分为两部分,用于卖方和买方注册(我不知道是否可以/建议使用FOSUserBundle)
我希望你们帮助我做对.干杯:)
登录工作正常.在/ admin/logout获取错误
您必须在安全防火墙配置中激活注销.
在
in *\vendor\sonata-project\user-bundle\Controller\AdminSecurityController.php at line 98
我将logout设置为true,如下所示:
security.yml:
firewalls:
main:
pattern: .*
#pattern: ^/
form-login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: /login
use_forward: false
check_path: /login_check
failure_path: null
logout: true
anonymous: true
Run Code Online (Sandbox Code Playgroud)
你如何使用symfony2.4,fosuserbundle1.3和sonata-admin dev-master来避免这个错误?
我想覆盖一些来自FOSUserBundle的路线
MyBundle/Resources/config/routing/security.yml
fos_user_security_login:
path: /{_locale}/login
defaults: { _controller: FOSUserBundle:Security:login }
requirements:
_locale: %locales%
fos_user_security_check:
path: /login_check
defaults: { _controller: FOSUserBundle:Security:check }
requirements:
_locale: %locales%
fos_user_security_logout:
path: /{_locale}/logout
defaults: { _controller: FOSUserBundle:Security:logout }
requirements:
_locale: %locales%
Run Code Online (Sandbox Code Playgroud)
但它不起作用,找不到路线
MyBundle/Resources/config/routing/security.xml
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="fos_user_security_login" pattern="/{_locale}/login">
<default key="_controller">FOSUserBundle:Security:login</default>
</route>
<route id="fos_user_security_check" pattern="/login_check">
<default key="_controller">FOSUserBundle:Security:check</default>
<requirement key="_method">POST</requirement>
</route>
<route id="fos_user_security_logout" pattern="/{_locale}/logout">
<default key="_controller">FOSUserBundle:Security:logout</default>
</route>
</routes>
Run Code Online (Sandbox Code Playgroud)
这有效,但我不知道如何从parameter.yml传递我的locales参数
我目前正在开发一个Symfony2项目.它基于Sonata,使用SonataUserBundle/FOSUserBundle来管理用户.最初的开发工作做得很糟糕,我正在重构很多.
该应用程序定义了三个级别的用户:
这些被定义为具有FOSUserBundle的组,并且附加了一堆角色.
现在代码中的每个地方,以前的开发人员都使用(硬编码)组的数据库ID来制作这样的情况:
$userGroup = $em->getRepository('ApplicationSonataUserBundle:Group')->findOneByName($group_name);
$userGroupId = $userGroup->getId();
if ($userGroupId == 1) {
// Administrator case
...
} else if ($userGroupId == 7) {
// Consultant case
...
}
Run Code Online (Sandbox Code Playgroud)
这显然非常糟糕.
我的问题是,我确定如何以一种好的方式重构这一点.
我看到三种可能的方式:
直接使用定义的角色:ROLE_ADMIN,ROLE_CONSULTANT,ROLE_BUSINESS;
仍然使用组,但有一些常量与组名称,以避免在整个地方重复它们;
在FOSUserBundle之上使用多用户系统.我很快回顾了RollerworksMultiUserBundle和PUGXMultiUserBundle.虽然我不知道这是不是有点开销,因为我的用户实际上共享相同的信息.
如果你们能指出我正确的方向,那将非常感激.也许有一种完全正确的方法来实现这一点.
我正在尝试覆盖我的FOSUserBundle的注册控制器.我按照https://symfony.com/doc/3.4/bundles/inheritance.html上的步骤操作但是我收到以下错误:
不能自动装配服务 "的appbundle \控制器\这个RegistrationController":方法的参数 "$ formFactory" "FOS\UserBundle \控制器\这个RegistrationController :: __结构()" 引用接口 "FOS\UserBundle \表格\厂\ FactoryInterface",但没有这样的服务存在.您应该将此接口别名为其中一个现有服务:"fos_user.profile.form.factory","fos_user.registration.form.factory","fos_user.change_password.form.factory","fos_user.resetting.form".厂".
我的RegistrationController.php:
// src/UserBundle/Controller/RegistrationController.php
namespace AppBundle\Controller;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
use Symfony\Component\HttpFoundation\Request;
class RegistrationController extends BaseController
{
public function registerAction(Request $request)
{
$response = parent::registerAction($request);
// ... do custom stuff
return $response;
}
}
Run Code Online (Sandbox Code Playgroud)
我的AppBundle.php
<?php
namespace AppBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AppBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要更多信息,请告诉我,以便我可以更新此问题.
fosuserbundle ×10
symfony ×10
php ×4
sonata-admin ×2
autowired ×1
doctrine-orm ×1
multi-tenant ×1
symfony-2.3 ×1
symfony-2.4 ×1
symfony-3.4 ×1
yaml ×1