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

时间:2015-09-21 14:06:57

标签: php authentication silex

我是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());

管理员未定义任何其他类型的用户。该设置应由管理员运行一次。

我尝试通过以下方式自定义用户名和密码: 第一件事(这是我尝试的一切都很常见)):

// Default password and username 
$username='admin';        $passwd='5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==';`

The following didn't work (no magical update):

`$app->post('/setup', function(Request $request) use ($app, $username, $passwd) {
   $username = $request->get('username');
   $passwd= $request->get('passwd');
});

所以我尝试了类似的东西:

$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,并重新定义"用户"数组的一部分。合并也没有帮助。

我在这里有点想法:S我该怎么做?

1 个答案:

答案 0 :(得分:1)

动态方式

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

您需要的是用户提供商。现在你没有保存新用户,并且你试图重新定义你的两个静态变量 - 如果我可以添加,则不检查给定的值 - 这在多种方面是错误的:)

要么稍微潜水并查看如何Define a Custom User Provider in Silex,如果您对用户对象有特殊要求,也可能how to create an User-Entity,或者您使用一些已编写的Silex用户提供程序安全服务,如:

Jason Grimes的

Silex-SimpleUser

静态方式

如果您不想动态添加/编辑/删除用户,或者只有少数用户,您可以随时将静态用户添加到用户数组中:

'users' => array(
  'admin1' => array('ROLE_ADMIN', 'encodedAndSaltedPW1'),
  'admin2' => array('ROLE_ADMIN', 'encodedAndSaltedPW2'),
  'admin3' => array('ROLE_ADMIN', 'encodedAndSaltedPW3'),
)

在这种情况下,您需要对文档进行编码和加盐,如文档中所述:

  

//找到UserInterface实例的编码器

     

$encoder = $app['security.encoder_factory']->getEncoder($user);

     

//计算foo的编码密码

     

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

另请参阅docs for the 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'))
  )
);

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