在 Silex 中将用户添加到防火墙的用户列表
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());
除了管理员之外,没有定义其他类型的用户。该设置应由管理员 运行 设置一次。
我试过通过以下方式自定义用户名和密码:
第一件事(这对我尝试过的一切都很常见):
// 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" 部分。合并也没有帮助。
我有点搞不懂 :S 我该怎么做?
动态方式
您没有在任何地方保存您的用户。我假设您在定义 $app['security.firewalls']
之前定义了 $username
和 $passwd
,否则应该已经抛出错误。
您需要的是 User Provider。现在你没有保存新用户,你只是想重新定义你的两个静态变量——如果我可以添加的话,不检查给定的值——这在很多方面都是错误的:)
您要么深入研究并查看如何 Define a Custom User Provider in Silex and if you have special requirements to an User-Object also probably how to create an User-Entity,要么使用一些已经编写好的 Silex 安全服务用户提供程序,例如:
Silex-SimpleUser 杰森·格兰姆斯
静态方式
如果您不想动态 add/edit/delete 用户或者您只有少数用户,您可以随时将静态用户添加到用户数组中:
'users' => array(
'admin1' => array('ROLE_ADMIN', 'encodedAndSaltedPW1'),
'admin2' => array('ROLE_ADMIN', 'encodedAndSaltedPW2'),
'admin3' => array('ROLE_ADMIN', 'encodedAndSaltedPW3'),
)
在这种情况下,您需要按照文档中的描述对 PW 进行编码和加盐:
// find the encoder for a UserInterface instance
$encoder = $app['security.encoder_factory']->getEncoder($user);
// compute the encoded password for 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 文件,如果没有适当的权限,任何人都可以读取 - 所以一定要在其中输入 encoded/salted 密码,绝不可读的。
然后您需要将 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'))
)
);
请注意,此代码未经测试,应该更有可能给您一个想法。希望对您有所帮助。
我是 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());
除了管理员之外,没有定义其他类型的用户。该设置应由管理员 运行 设置一次。
我试过通过以下方式自定义用户名和密码: 第一件事(这对我尝试过的一切都很常见):
// 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" 部分。合并也没有帮助。
我有点搞不懂 :S 我该怎么做?
动态方式
您没有在任何地方保存您的用户。我假设您在定义 $app['security.firewalls']
之前定义了 $username
和 $passwd
,否则应该已经抛出错误。
您需要的是 User Provider。现在你没有保存新用户,你只是想重新定义你的两个静态变量——如果我可以添加的话,不检查给定的值——这在很多方面都是错误的:)
您要么深入研究并查看如何 Define a Custom User Provider in Silex and if you have special requirements to an User-Object also probably how to create an User-Entity,要么使用一些已经编写好的 Silex 安全服务用户提供程序,例如:
Silex-SimpleUser 杰森·格兰姆斯
静态方式
如果您不想动态 add/edit/delete 用户或者您只有少数用户,您可以随时将静态用户添加到用户数组中:
'users' => array(
'admin1' => array('ROLE_ADMIN', 'encodedAndSaltedPW1'),
'admin2' => array('ROLE_ADMIN', 'encodedAndSaltedPW2'),
'admin3' => array('ROLE_ADMIN', 'encodedAndSaltedPW3'),
)
在这种情况下,您需要按照文档中的描述对 PW 进行编码和加盐:
// find the encoder for a UserInterface instance
$encoder = $app['security.encoder_factory']->getEncoder($user);
// compute the encoded password for 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 文件,如果没有适当的权限,任何人都可以读取 - 所以一定要在其中输入 encoded/salted 密码,绝不可读的。
然后您需要将 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'))
)
);
请注意,此代码未经测试,应该更有可能给您一个想法。希望对您有所帮助。