我正在开发一个使用Symfony2的网站.
我成功安装了FOSUserBundle.现在我想安装FOSFacebookBundle,以便它可以与FOSUserBundle一起使用.
我真的不了解整个"提供者用户"的事情.在FOSFacebookBundle文档中,它说"7.可选择定义自定义用户提供程序类并将其用作提供程序或定义登录路径",我应该这样做以使这两个程序包相互协作吗?那个有什么用?
我想让这两个人互相帮助.
我正在尝试使用FOSUserBundle更改用户的角色.问题是:如果用户同时登录,他必须重新登陆以查看新角色.
有解决方案吗
我对symfony2和FOSUserBundle有一个非常奇怪的问题.
我可以使用/ en/logout注销,但不能使用/ nl/logout或/ fr/logout注销.
当我尝试使用nl或fr注销时,我得到:
You must activate the logout in your security firewall configuration.
Run Code Online (Sandbox Code Playgroud)
虽然我配置了它.我似乎无法理解为什么/ en/logout工作而其余部分没有.
这是我的代码:
security:
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
encoders:
FOS\UserBundle\Model\UserInterface: sha512
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
check_path: fos_user_security_check
default_target_path: /%locale%/login
always_use_default_target_path: true
failure_path: /%locale%/login
logout:
path: /%locale%/logout
target: homepage
anonymous: true
Run Code Online (Sandbox Code Playgroud)
user bundle > FOS
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
prefix: /{_locale}
requirements:
_locale: fr|nl|en
Run Code Online (Sandbox Code Playgroud)
class LoginController extends Controller {
/**
* @Route("{_locale}/logout-test", name="logout", defaults={"_locale"="en"} , requirements = {"_locale" …Run Code Online (Sandbox Code Playgroud) 我正在构建我的第一个严肃的Symfony2项目.我正在为我的用户/组管理扩展FOSUserBundle,我希望新用户自动添加到默认组.我想你只需要像这样扩展User实体构造函数:
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
// Get $defaultGroup entity somehow ???
...
// Add that group entity to my new user :
$this->addGroup($defaultGroup);
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是如何首先获得我的$ defaultGroup实体?
我尝试在实体中使用实体管理器,但后来我意识到它是愚蠢的,Symfony抛出错误.我搜索了这个,但发现没有真正的解决方案,除了可能为此设置服务 ......虽然这对我来说似乎很不清楚.
我正在使用symfony2和FOSUserBundle.
通常,我可以从Controller获取用户数据
$user = $this->get('security.context')->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)
要么
$user = $this->container->get('security.context')->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)
但是现在,我想从eventlistner获取从Ajax调用的userdata.
可能吗?或不?
我的来源在这里.
namespace Acme\MemberBundle\EventListener;
use ADesigns\CalendarBundle\Event\CalendarEvent;
use ADesigns\CalendarBundle\Entity\EventEntity;
use Doctrine\ORM\EntityManager;
class CalendarEventListener
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function loadEvents(CalendarEvent $calendarEvent)
{
$startDate = $calendarEvent->getStartDatetime();
$endDate = $calendarEvent->getEndDatetime();
$user = $this->container->get('security.context')->getToken()->getUser();//it doesnt work
// load events using your custom logic here,
// for instance, retrieving events from a repository
$companyEvents = $this->entityManager->getRepository('UserBundle:MutorSche')
->createQueryBuilder('company_events')
->where('company_events.event_datetime BETWEEN :startDate and :endDate')
->setParameter('startDate', $startDate->format('Y-m-d H:i:s'))
->setParameter('endDate', $endDate->format('Y-m-d …Run Code Online (Sandbox Code Playgroud) 我在很多很多控制器操作中运行相当于这段代码,基本上它抓住用户的用户名,如果该用户名附加到博客实体,它将允许用户查看博客实体:
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
return $this->render('MySiteBundle:Blog:index.html.twig', array(
'entities' => $entities,
Run Code Online (Sandbox Code Playgroud)
我想将它转移到服务中,这样我就可以减少代码重复.我想避免在控制器中尽可能多地使用逻辑.
话虽这么说,我不知道如何在服务中访问用户会话和学说.
这是我的services.yml:
mysite.user.blog:
class: MySite\SiteBundle\Services\BlogUser
Run Code Online (Sandbox Code Playgroud)
这就是我试图在控制器中调用它的方式:
public function testAction() {
$response = $this->get('mysite.user.blog');
return new Response($response);
}
Run Code Online (Sandbox Code Playgroud)
我确实尝试使用事件订阅者/侦听器标记,但这似乎没有完成我想要的任务.
这是我完全可怕的服务尝试.没有使用构造函数我无法得到任何响应.
namespace MySite\SiteBundle\Services;
use MySite\SiteBundle\Entity\Blog;
class BlogUser {
protected $entities;
public function __construct(){
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
}
}
Run Code Online (Sandbox Code Playgroud)
我是以完全错误的方式来做这件事的吗?有没有更好的方法让我失踪?
修改了我的命名约定:
//services.yml
mysite.user.blog.entities:
class: Mysite\SiteBundle\Services\BlogUser
arguments: ["@doctrine.orm.entity_manager", "@security.context"]
Run Code Online (Sandbox Code Playgroud)
在控制器动作中:
$userEntities = $this->get('mysite.user.blog.entities');
$entities …Run Code Online (Sandbox Code Playgroud) 我正在使用fos用户捆绑和pugx多用户捆绑.我已经阅读了所有文档,我是Symfony的新手.在pugx多用户包中,每个点都有一个样本,但只有一个:成功注册.
这是我的代码:
class RegistrationController extends BaseController
{
public function registerAction(Request $request)
{
$response = parent::registerAction($request);
return $response;
}
public function registerTeacherAction()
{
return $this->container
->get('pugx_multi_user.registration_manager')
->register('MyBundle\Entity\PersonTeacher');
}
public function registerStudentAction()
{
return $this->container
->get('pugx_multi_user.registration_manager')
->register('MyBundle\Entity\PersonStudent');
}
}
Run Code Online (Sandbox Code Playgroud)
问题是->get('pugx_multi_user.registration_manager')返回经理.在fos用户覆盖控制器帮助中,他们得到a form或a form.handler.我很难将这些与pugx_multi_user管理器"链接"起来.
我应该在registerTeacherAction()为教师设置角色时设置什么代码,以及registerStudentAction()为成功注册设置学生角色?
由于我正在扩展BaseUser,我的用户实体中没有属性$ name,如何向其添加验证,我可以向该实体添加属性$ username吗?是否会混淆或覆盖某些功能或验证或本机提供给用户类的?
我解决了这个问题FOSUserBundle - 验证用户名,密码或电子邮件字段,但因为我使用了一堆对我不起作用的注释验证.
后续问题 - 我在fosUSerBundle XML文件中看到用于验证用户本身是一个使用截取用户名的检查器,我没有得到该功能,如果我尝试添加,我会直接看到SQL错误消息与现有用户同名的用户.这是因为我使用注释会一起覆盖XML验证文件吗?
use BizTV\UserBundle\Validator\Constraints as BizTVAssert;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use BizTV\BackendBundle\Entity\company as company;
class User extends BaseUser implements AdvancedUserInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
//TODO: Add regex on $name for a-z, A-Z, 0-9 and _ (underscore)
//TODO: Add constraint on $name * @BizTVAssert\NameExists (and finish coding this constraint)
/**
* @var object BizTV\BackendBundle\Entity\company
*
* …Run Code Online (Sandbox Code Playgroud) 我最近使用composer更新了symfony2,现在我无法登录.这是相关文件.如果需要更多数据,请与我们联系.
应用程序/配置/ routing.yml中
app_admin:
resource: "@AppAdminBundle/Resources/config/routing.yml"
prefix: /admin
host: dashboard.muchomonitor.com
app_website:
resource: "@AppWebsiteBundle/Resources/config/routing.yml"
prefix: /
host: www.muchomonitor.com
app_monitor:
resource: "@AppMonitorBundle/Resources/config/routing.yml"
prefix: /
host: dashboard.muchomonitor.com
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
host: dashboard.muchomonitor.com
fos_user_security_reset:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /login
host: dashboard.muchomonitor.com
Run Code Online (Sandbox Code Playgroud)
应用程序/配置/ security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
user:
entity: { class: App\MonitorBundle\Entity\User, property: username }
firewalls:
main:
pattern: ^/
provider: user
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: fos_user_security_login
check_path: fos_user_security_check
default_target_path: /
logout: true
anonymous: true …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照此处的教程安装FOSUserBundle
当我在第7步时,我尝试更新ORM运行的数据库模式
php app/console doctrine:schema:update --force
但出现错误
InvalidConfigurationException: Unrecognized options "csrf_provider" under "security.firewalls.form_login"
Run Code Online (Sandbox Code Playgroud)
这是我的防火墙:
firewalls:
main:
pattern:
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
Run Code Online (Sandbox Code Playgroud)
我能做什么?我没有设置模式因为,如果我设置类似的东西
pattern: ^/
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
InvalidTypeException:路径"security.firewalls.pattern"的类型无效.预期的数组,但得到了字符串
更新:
csrf_protection已启用,但由于某些原因,我不明白,不起作用.我试图"重置"它,禁用和启用,现在它可以正常工作.在我的项目中,我启用它
csrf_protection: ~
Run Code Online (Sandbox Code Playgroud) fosuserbundle ×10
symfony ×10
controller ×2
bundles ×1
csrf ×1
facebook ×1
localization ×1
routing ×1
service ×1
username ×1
validation ×1