向防火墙添加一个用户'用户列表


Add a user to the firewalls' user list in Silex

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

$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());

除了admin之外没有定义其他类型的用户。设置只需要管理员运行一次。

我尝试了以下方法自定义用户名和密码:第一件事(这在我尝试过的所有事情中都很常见):

// 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,并重新定义数组的"users"部分。合并也没用

我有点不知道该怎么做呢?

动态方式

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

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

你可以稍微深入一下,看看如何在Silex中定义自定义用户提供者,如果你对用户对象有特殊要求,也可能是如何创建用户实体,或者你使用一些已经为Silex安全服务编写的用户提供者,如:

Silex-SimpleUser/Jason Grimes


静态方法

如果你不想动态地添加/编辑/删除用户,或者你只有几个用户,你可以把你的静态用户添加到users数组中:

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

在这种情况下,您需要像文档中描述的那样对pw进行编码和处理:

//查找UserInterface实例的编码器

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

//计算foo

的编码密码

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

请参阅SecurityServiceProvider的文档以获取更多信息。


Your Way: Single-User-Provider

听了你的评论,我更了解你的需求了。

你当然可以有一个自己的普通的"single - user - provider"。-可以像这样:

$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文件可以被任何人读取-因此请确保将编码/加盐的密码放入其中,而不是可读的密码。

然后你需要阅读配置。

$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'))
  )
);

请注意,这段代码是未经测试的,应该更有可能给你一个想法。