Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将用户添加到防火墙';Silex中的用户列表_Php_Authentication_Silex - Fatal编程技术网

Php 将用户添加到防火墙';Silex中的用户列表

Php 将用户添加到防火墙';Silex中的用户列表,php,authentication,silex,Php,Authentication,Silex,我是Silex和Symfony的新手,决定使用Silex构建一个(真正)使用身份验证的小应用程序。身份验证过程正在运行。我目前正在做一个小的设置页面,允许用户定义他的用户名和密码。auth如下所示: $app['security.firewalls'] = array( 'admin' => array( 'pattern' => '/private', 'form' => array('login_path' => '/login', 'check_

我是Silex和Symfony的新手,决定使用Silex构建一个(真正)使用身份验证的小应用程序。身份验证过程正在运行。我目前正在做一个小的设置页面,允许用户定义他的用户名和密码。auth如下所示:

$app['security.firewalls'] = array(
  'admin' => array(
    'pattern' => '/private',
    'form' => array('login_path' => '/login', 'check_path' => '/private/login_check'),
    'logout' => array('logout_path' => '/private/logout', 'invalidate_session' => true),
    'users' => array(
      $username => array('ROLE_ADMIN', $passwd)
    )
  )
);
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->post('/setup', function(Request $request) use ($app) {

   $username = $request->get('username');
   $passwd= $request->get('passwd');

   $file = 'config.json';
   $config = array($username => array('ROLE_ADMIN', $passwd));
   file_put_contents($file, json_encode($config));

   return $app->redirect($app['url_generator']->generate('login'));
});
管理员没有定义其他类型的用户。安装程序将由管理员运行一次

我已尝试通过以下方式自定义用户名和密码: 第一件事(这是我尝试过的所有事情的共同点):

所以我尝试了以下方法:

$app->post('/setup', function(Request $request) use ($app) {
   $username = $request->get('username');
   $passwd= $request->get('passwd');
   $app['security.firewalls']['admin']['users'] =  array($username => array('ROLE_ADMIN', $passwd));
  $app->register(new Silex\Provider\SecurityServiceProvider());
});
无论是否注册新的SecurityServiceProvider,并重新定义阵列的“用户”部分。合并也无济于事

我有点不明白:我该怎么做?

动态方式 您没有将用户保存到任何位置。我假设您在定义
$app['security.firewalls']
之前定义了
$username
$passwd
,否则应该已经抛出错误

您需要的是一个用户提供程序。现在,您没有保存新用户,您只是试图重新定义两个静态变量—如果我可以添加的话,没有检查给定的值—这在多个方面都是错误的:)

您可以深入了解一下如何以及是否对用户对象有特殊要求,也可以使用一些已经编写好的用户提供程序来提供Silex安全服务,例如:

杰森·格里姆斯


静态方式 如果您不想动态添加/编辑/删除用户,或者只有少数用户,则始终可以将静态用户添加到用户阵列:

'users' => array(
  'admin1' => array('ROLE_ADMIN', 'encodedAndSaltedPW1'),
  'admin2' => array('ROLE_ADMIN', 'encodedAndSaltedPW2'),
  'admin3' => array('ROLE_ADMIN', 'encodedAndSaltedPW3'),
)
在这种情况下,您需要像文档中描述的那样对PW进行编码和盐处理:

//查找UserInterface实例的编码器

$encoder=$app['security.encoder\u factory']->getEncoder($user)

//计算foo的编码密码

$password=$encoder->encodePassword('foo',$user->getSalt())

有关更多信息,请参见


您的方式:单用户提供商 在你的评论之后,我更了解你的需求

当然,您可以拥有自己的普通“单用户提供商”——可以是这样的:

$app['security.firewalls'] = array(
  'admin' => array(
    'pattern' => '/private',
    'form' => array('login_path' => '/login', 'check_path' => '/private/login_check'),
    'logout' => array('logout_path' => '/private/logout', 'invalidate_session' => true),
    'users' => array(
      $username => array('ROLE_ADMIN', $passwd)
    )
  )
);
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->post('/setup', function(Request $request) use ($app) {

   $username = $request->get('username');
   $passwd= $request->get('passwd');

   $file = 'config.json';
   $config = array($username => array('ROLE_ADMIN', $passwd));
   file_put_contents($file, json_encode($config));

   return $app->redirect($app['url_generator']->generate('login'));
});
请注意,json文件如果没有适当的权限,任何人都可以读取,因此请确保将编码/加密密码放在其中,而不是可读的密码

然后需要将config.json读入防火墙配置:

$app['security.firewalls'] = array(
  'admin' => array(
    'pattern' => '/private',
    'form' => array('login_path' => '/login', 'check_path' => '/private/login_check'),
    'logout' => array('logout_path' => '/private/logout', 'invalidate_session' => true),
    'users' => json_decode(file_get_contents('config.json'))
  )
);

请注意,此代码未经测试,很可能会给您一个想法。我希望这会有所帮助。

您必须在控制器代码之外注册安全提供商。当应用程序命中控制器代码时,身份验证已经完成,因此在那里设置安全提供程序没有意义。你能详细说明一下你的最终目标是什么吗?是否要添加2个静态用户?你要登记表吗?/setup URI的目的是什么,添加新用户?如果是这样,您需要一个用户存储库(db、文件或其他内存中的提供程序,在请求完成时不会丢失其内容)。应用程序的用途是使用两个文件夹:一个公用文件夹,另一个专用文件夹,可通过身份验证访问。目的:使用(正确配置)服务器存储文件的人只需在服务器上解压缩我的项目文件,就可以通过身份验证获得一个简单的文件列表。要使文件公开,一个简单的mv就足够了。/setup端点(打算运行一次)的目标是为人们提供一种图形化的方式来配置他们打算用作私有和公共文件夹的文件夹,以及他们想要使用的用户名和密码。我希望避免db配置。您可以将用户存储在一个单独的文件中,并通过设置对该文件进行读/写操作(您可以在该文件中使用json、yaml、direct php,以及对其进行读/写操作)。正如您在下面所评论的,您不想使用db,这很好,但是您需要某种方式来存储用户,并且您当前的设置非常混乱(您不应该允许应用程序写入index.php文件)。我看到了这些解决方案,但希望避免使用DB,因为我希望在项目解压后,应用程序能够充分发挥功能,而无需进行太多配置(如设置DB)。另外,我不想做用户管理,我只想有一个admin类型的用户(我已经有了),其用户名和密码可以由使用/setup端点提取我的项目的用户以图形方式设置。目前,我只提供了一个/password/{pwd}端点,因此用户可以复制他的编码和盐渍密码粘贴到index.php中(这很有效,但感觉很凌乱)@Mebius谢谢你的评论-我编辑了我的答案,希望这能让你前进我在YAML中确实切换到了类似的方式(选择JSON而不是JSON,因为硬币告诉我是这样的)这对我来说是100%:-)@Mebius Nice,我很高兴它成功了!我喜欢一个计划的结合:)