小编use*_*259的帖子

PHP Websocket在测试中验证用户(传递会话cookie)

我试图测试一个场景,一方面,匿名用户应该立即断开与Websocket连接的连接,另一方面,经过身份验证的用户应该保持在websocket连接中.第一种情况可以通过使用下面的代码轻松测试.身份验证过程无效.

对于会话存储,我将Cookie身份验证与数据库结合使用:Symfony PDO会话存储.它一切正常,但是当使用身份验证测试所描述的行为时,我不知道如何在测试中验证用户.作为客户端,我正在使用Pawl异步Websocket客户端.这看起来如下:

\Ratchet\Client\connect('ws://127.0.0.1:8080')->then(function($conn) {
    $conn->on('message', function($msg) use ($conn) {
        echo "Received: {$msg}\n";
    });

    $conn->send('Hello World!');
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});
Run Code Online (Sandbox Code Playgroud)

我知道作为第三个参数,我可以将头信息传递给"connect"方法,但我找不到一种方法,以便在ws握手期间连接客户端并正确传递cookie.我想到了类似的东西:

  1. 通过创建身份验证令牌来验证客户端
  2. 我在序列化用户的数据库中的会话表中创建了一个新条目
  3. 我将创建的cookie作为第三个参数传递给connect方法

这是我认为可行的理论,但用户总是在websocket方面保持匿名.这里到目前为止的理论代码:

// ...
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class WebsocketTest extends WebTestCase
{

    static $closed;

    protected function setUp()
    {
      self::$closed = null;
    }


    public function testWebsocketConnection()
    {
      $loop = Factory::create();
      $connector = new Connector($loop);

      // This user exists in database user tbl
      $symfClient = $this->createSession("testuser@test.com");

      $connector('ws://127.0.0.1:80', [], …
Run Code Online (Sandbox Code Playgroud)

php testing websocket symfony ratchet

35
推荐指数
1
解决办法
1766
查看次数

实时通知UML类图

我正在尝试实现一个实时通知系统(如fb,xing,twitter ..).因此,我在构建实体之前创建了一个UML类图.展示如下:


编辑:我想到了这种方法,似乎这不是正确的方法.让我们检查下面的情况:用户U在事件E的图像中添加了注释C.如何正确存储,我的意思是EventNotification只有事件E的引用,但不在I和C上.因此我需要创建一个"EventImageNotification"类也是如此,这将是一个烂摊子.如果只有一个"通知"类并向其添加"元数据"字段,它是否是一个更好的解决方案,它存储对所有相关字段的引用?


(我以后使用OR-Mapper来实现关系).

[1]一个用户可以创建活动,例如"Silvester Party 2015".(一对多).此事件有一个仪表板,当创建者在该事件上发布内容时,用户可以订阅接收更新(ManyToMany).

[2]当用户在事件的仪表板上发布内容时,订阅的用户应该收到通知.因此,我创建了EventNotification类.用户和EventNotification之间的关系是ManyToMany.

[3]为了保持清洁,我创建了一个与Notification类型相关的AbstractNotification类.通知类型类似于name ="EventPost"和template ="用户用户在事件__event上发布了新内容".

[4]抽象类NotificationConnector为EventNotification和User(UserEventNotification)之间的映射类提供字段.我创建它们以便将来轻松扩展它,例如用户可以创建也触发事件等的书籍.然后我需要创建一个"BookNotification"和一个"UserBookNotification"类来存储这个新实体的通知.

这种方法是好的还是完全搞砸了?请告诉我您对此图表的看法:

(建立关联的箭头应该是正常的线,我使用的工具就是不能这样做).

通知UML

php notifications uml entity-relationship symfony

25
推荐指数
1
解决办法
1279
查看次数

Symfony 2中的ArrayCollection(表单集合)索引冲突

我正在使用Symfony2来构建我的页面.当我尝试更新表单集合时(如cookbook条目" 如何嵌入表单集合 "中所述),我得到前端的索引和后端的ArrayCollection索引的冲突.

我有关系用户< - >地址(OneToMany).用户想要创建/更新/删除他的地址,因此他可以在javascript部分新地址元素的帮助下在前端添加/删除.他做了以下事情:

(1)添加新地址(索引:0)

(2)添加新地址(索引:1)并立即再次删除该地址

(3)添加新地址(索引:2).

当他点击"保存"按钮时,以下代码保存/更新用户(及其地址):

 $this->em->persist($user);
 $this->em->flush();
Run Code Online (Sandbox Code Playgroud)

例如,新地址可以正确地保存到数据库中.现在用户想要更新地址,例如索引0.当他现在点击保存按钮时,它用"索引0"更新地址,但同时,它再次添​​加带有"索引2"的地址到数据库(对象).为了更好地理解这个问题,我画了一个小插图(手工制作,对我糟糕的艺术技巧感到抱歉):

收集错误图像 现在,我的对象/数据库中的"索引1"的地址是两倍.我知道为什么会发生这种情况,这是因为第一个"索引1"地址被映射到ArrayCollection元素"number 1",第二个被映射到"number 2"(因为前端名称"index 2").你可以说:"它只是填满了地址,直到它到达后端的前端索引".但是我该如何解决这个问题呢?

站点说明:使用ajax请求会发生此行为,因为如果您在单击"保存按钮"后重新加载页面,它将使用后端中的索引正确地重新索引前端中的地址.

我建议处理这种情况:

单击使用服务器端索引保存后重新索引前端索引.这是我的问题的明确/唯一解决方案吗?

javascript php forms collections symfony

18
推荐指数
1
解决办法
1331
查看次数

Websockets通知 - /聊天 - 系统

我已经阅读了很多关于websockets的内容,并且已经在我的系统中实现了它们.这个问题是关于如何正确使用它们.我想以正确的方式实现通知和聊天系统.

对于通知,我有频道"通知/频道",对于聊天,我有频道"聊天/频道".

这两个渠道不是太"全球化"吗?假设当该网站拥有1.000.000个用户时,这意味着所有这些用户都将处于这两个渠道中.当一个通知发送给另一个特定用户时,这意味着该消息通过一个1.000.000用户订阅的频道发送.

与聊天消息相同.假设用户想要与其他用户聊天.每条消息都将通过所有用户订阅的频道,最后,由于传递的receiver_id,只有目标用户才会收到该消息.

如何正确处理通知渠道和"私人"聊天渠道?

为每个用户创建一个"子频道"(群聊和通知,EG"通知/频道/用户1")或者只是让所有用户进入一个大频道会更高效和安全吗?

php notifications rpc publish-subscribe websocket

11
推荐指数
1
解决办法
810
查看次数

Doctrine Query Builder选择Count with Case

我有以下sql语句,我想转换为doctrine查询生成器.目标是计算评级值1和评级值2存在多少评级.

SELECT 
COUNT(CASE WHEN rating.rating = 1 THEN rating.rating END) as rat1, 
COUNT(CASE WHEN rating.rating = 2 THEN rating.rating END) as rat2 
FROM rating 
Run Code Online (Sandbox Code Playgroud)

这个sql语句运行正常 - 但是当我尝试将它转换为Doctrine语句时,它就不再存在了.当什么都不应该被计算(因为没有对这个值的评级存在)时,它会返回一个"1"而不是0.如果没有什么可计算的,我怎么能告诉学说简单地返回一个零?我通过删除"ELSE 0"尝试了它,但后来我得到一个错误,这部分是必需的..

return $qb
        ->addSelect('COUNT(CASE WHEN r.rating = 1 THEN r.rating ELSE 0 END) as rat_1')
        ->addSelect('COUNT(CASE WHEN r.rating = 2 THEN r.rating ELSE 0 END) as rat_2')
        ->getQuery()
        ->getResult();
Run Code Online (Sandbox Code Playgroud)

问候,

"sum"不是必需的 - 例如:投票2,2,2,2,2应该返回5,因为值为2的评级被投票5次.

php sql symfony doctrine-orm

7
推荐指数
2
解决办法
2705
查看次数

找不到PHPDox文件

我试图在Windows Server 2012上运行phpdox - 但我收到错误:

PHP Version: 7.0.5 (WINNT)
PHPDox Version: 0.8.1.1
Exception: TheSeer\phpDox\Generator\TokenFileException (Code: 1)
Location: phar://D:/htdocs/AscPro/bin/phpdox-0.8.1.1.phar/phpdox/generator/pro
ject/TokenFile.php (Line 19)

File 'file:/D:/htdocs/AscPro/build/phpdox/tokens/AppBundle/AppBundle.php.xml'
not found
Run Code Online (Sandbox Code Playgroud)

我检查了位置,文件没有丢失.我在与jenkins的持续集成过程中遇到了这个问题.这很奇怪,因为同样的phpdox版本在ubuntu上对我有用.也许这与事实有关,所有程序都在"C:"上,包括詹金斯 - 但jenkins工作区是在"D:"上吗?

php continuous-integration symfony jenkins windows-server-2012-r2

7
推荐指数
1
解决办法
248
查看次数

Websocket多个频道与一个频道+服务器端处理[GroupChat]

假设我们想要创建私人聊天室,用户可以在这里聊天.用户可以加入多个/ x组.在每种情况下,我都需要在服务器上创建一个唯一的组,并为这些用户订阅.哪种方法是推荐/更高效的方式:


[1]在服务器端,我创建了一个Room类,并为每个群聊添加新的房间频道,例如"chats/room-asdhqk1","chats/room-fwuefhw1","chats/room-awsdhqwd2".现在,某些指定用户可以加入此频道并添加到组客户端列表中.在客户端,用户订阅了他们添加到的组渠道.

问题:当用户在x通道中时,我需要在侧载后将他订阅到这些x通道.好:可以通过群组频道名称向特定群组广播,并且订阅该频道的所有用户将自动接收消息,因为他们已订阅了js部分内的频道.


[2]每个用户都有自己的频道,例如"notifications/user-1","notifications/user-2"....... 在服务器端,我在Rooms Class(无通道)中创建组.通过将用户添加到房间列表的子列表中,可以将用户添加到特定房间.当他们彼此聊天时,服务器迭代群聊的订阅用户,并向每个用户通知频道发送消息 - 这里根本没有群组频道 - 仅针对每个用户频道.

问题:我无法轻松地广播消息,我需要遍历每个订阅用户并将消息发送到他的通知通道.另外,我不能在前端使用"发布"方法轻松地将消息发布到频道,因为用户在不同的频道中分开.

好:最后,广播方法也会这样做:迭代订阅者列表.为了发送消息,我可以轻松实现与"发布"方法相同的RPC方法 - 查找组的订阅用户并将消息发送给他们.使用这种方法,用户不需要连接到客户端的x通道,他只有一个通道可以处理所有通道.

(我知道对于第二种方法,需要一个推动器(例如zmq)).


你有什么看法?我认为第二个更好,因为我不必在客户端订阅x-channels.如果用户需要首先连接到例如500个频道,则这将不具有性能.

问候.

php chat websocket autobahn ratchet

6
推荐指数
0
解决办法
1211
查看次数

FOSUserBundle BCryptPasswordEncoder salting

升级到php7后,BCryptPasswordEncoder会抛出以下错误,例如在使用FOSUserBundle标准注册页面时注册:

"在C:\ xampp\htdocs\ascentary\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php第81行"C:不推荐使用'salt'选项来使用password_hash XAMPP\htdocs中\ testproject \供应商\贝哈特\贝哈特的\ src \贝哈特\试验工作\电话\处理器\ RuntimeCallHandler".

我已经跟踪了这个问题,问题是FOS UserManager类,它调用:

/**
 * {@inheritDoc}
 */
public function updatePassword(UserInterface $user)
{
    if (0 !== strlen($password = $user->getPlainPassword())) {
        $encoder = $this->getEncoder($user);
        $user->setPassword($encoder->encodePassword($password, $user->getSalt()));
        $user->eraseCredentials();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里传递$ user-> getSalt()会抛出错误,因为在php7中,不再允许您将自定义salt传递给bcrypt encoding/password_hash函数.另外,我在基本fos用户实体中看到一个问题,因为在其构造函数中,salt设置为:

$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
Run Code Online (Sandbox Code Playgroud)

问题:

(1)如何解决我上面发布的错误?也许覆盖了UserManager,或者是否有fos提供的解决方案?

(2)如何正确保护盐,即自动生成?

(3)是否还需要其他更新,例如更新ircmaxell lib?

php bcrypt password-hash symfony fosuserbundle

5
推荐指数
1
解决办法
1781
查看次数

Symfony单元测试安全性(ACL - 注释)

我想检查具有访问控制的方法,例如,只授予具有特定角色的方法.因此,我在Symfony中了解两种方式:

  1. 方法上方的@Security注释(SensioFrameworkExtraBundle)或
  2. 在我的方法中调用authorization_checker exploizit

当谈到单元测试时(对于我的案例phpspec,但我认为phpunit行为在这种情况下几乎相同),我想测试只有匿名用户应该能够调用方法.数字2,它工作正常.在这里我的设置:

RegistrationHandlerSpec:

class RegistrationHandlerSpec extends ObjectBehavior
{     
   function let(Container $container, AuthorizationCheckerInterface $auth) {
     $container->get('security.authorization_checker')->willReturn($auth);
     $this->setContainer($container);
   }

   function it_should_block_authenticated_users(AuthorizationCheckerInterface $auth)
   {
     $auth->isGranted("ROLE_USER")->willReturn(true);
     $this->shouldThrow('Symfony\Component\Security\Core\Exception\AccessDeniedException')->during('process', array());
   }  
}
Run Code Online (Sandbox Code Playgroud)

在RegistrationHandler中,我有以下方法:

class RegistrationHandler
{
  public function process()
  {
     $authorizationChecker = $this->get('security.authorization_checker');
     if ($authorizationChecker->isGranted('ROLE_USER')) {
         throw new AccessDeniedException();
     }
     // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

好吧,这种方法工作正常 - 但通常情况下,我更喜欢使用1.带安全性注释(Sensio FrameworkExtraBundle),因此,它不起作用/我不知道为什么当它被编写为注释时没有触发异常:

/**
 * @Security("!has_role('ROLE_USER')")
 */
public function process()
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何使用@Security注释的第一种方法使这个例子工作,这是更可读和symfony推荐的最佳做法?

phpunit acl phpspec symfony

3
推荐指数
1
解决办法
636
查看次数

Kubernetes (kubectl) 运行 Pod

我正在尝试从处于运行状态的部署中获取第一个pod(按标签过滤)- 目前我只能实现以下目标,这只会给我一个部署中的第一个 pod(按标签过滤) - 而不是肯定的一个正在运行的 pod,例如它也可能是一个终止的 pod:

kubectl get pod -l "app=myapp" -l "tier=webserver" -l "namespace=test" 
                -o jsonpath="{.items[0].metadata.name}"
Run Code Online (Sandbox Code Playgroud)

怎么可能

a) 仅获取“正在运行”的 pod 列表并且(在此处或在 google 上找不到任何内容)

b) 从该列表中选择第一个。(这就是我目前正在做的)

问候

更新:我已经尝试了之前在评论中发布的链接,内容如下:

kubectl get pod -l "app=ms-bp" -l "tier=webserver" -l "namespace=test"  
-o json | jq -r '.items[] | select(.status.phase = "Running") | .items[0].metadata.name'
Run Code Online (Sandbox Code Playgroud)

结果是 4 个“空”——有 4 个正在运行的 Pod。

Edit2:已解决 - 见评论

json go kubernetes kubectl

3
推荐指数
1
解决办法
4982
查看次数

ZeroMQ与ubuntu中的php7无法正常工作

我已经将php5.6升级到php7,但是zeromq扩展会产生很多问题.我在哪里可以下载php7的正确zmq.so文件?官方网站都没有提供适用于php7的版本(我正在使用apache2.4).

我遵循了以下教程:如何安装ZeroMQ.

"安装ZeroMQ"步骤正常,但当我执行命令"make"时,第二步"安装PHP绑定"失败,出现以下错误:

"/home/puser/zeromq-4.1.4/php-zmq/zmq.c:2740:2: error: too many arguments to 
function 'zend_register_internal_class_ex' php_zmq_device_exception_sc_entry = 
zend_register_internal_class_ex(&ce_device_exception, php_zmq_exception_sc_entry, 
"ZMQException" TSRMLS_CC)  ^ In file included from /usr/include/php/20151012/main/php.h:40:
0, from /home/puser/zeromq-4.1.4/php-zmq/php_zmq.h:45,from /home/puser/zeromq-4.1.4/php-zmq
/zmq.c:31:/usr/include/php/20151012/Zend/zend_API.h:290:28: note: declared here ZEND_API 
zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, 
zend_class_entry *parent_ce);"
Run Code Online (Sandbox Code Playgroud)

使用php 5.6时,不会出现此错误.如何解决这个问题?

编辑:我发现ZeroMQ目前在这篇文章中与php7"无法正常工作":ZeroMQ安装.有没有解决方法?

php zeromq symfony composer-php ubuntu-14.04

2
推荐指数
1
解决办法
5040
查看次数