oppai / silex-simpleuser
Silex 的一个简单数据库支持的用户提供者,包括相关服务和控制器。
Requires
- php: >=5.3.0
README
一个用于与 Silex SecurityServiceProvider 一起使用的简单数据库支持的用户提供者。
除了用户提供者之外,此包还包括一个可选的控制器提供者,可以设置简单路由和控制器以进行基于表单的认证。
概览
SimpleUser 的目的是为 Silex PHP 微框架中的用户认证提供一种简单快捷的方式。Silex 内置了对 Symfony 2 安全组件的支持,功能强大,但需要编写大量的用户管理代码才能使用。SimpleUser 为安全组件提供了缺失的用户管理组件的简单实现。
如果您的 Silex 应用程序只需要一个具有最小用户模型的用户认证层,SimpleUser 可能就足够您使用了。如果您有更复杂的需求,您可能需要扩展 SimpleUser 类,或者您可能更喜欢将其分支并作为参考实现使用。您可以自由地选择这两种方法(这是受 BSD 许可的开源软件)。
SimpleUser 包提供以下功能
- 一个最小的
User类,基本上由电子邮件、密码、可选的名称和一些家务组成。 - 一个
UserManager类,用于管理User对象及其在 SQL 数据库中的持久性。它作为安全组件的用户提供者。 - 一个控制器和视图,可以用于处理基于表单的认证和用户管理。
- 一个
EDIT_USER安全属性,可以与安全组件的isGranted()方法一起使用,允许用户编辑自己的账户。 - Silex 服务提供者和控制器提供者,用于自动配置上述功能。
快速入门示例配置
此配置应该可以直接使用,以便快速启动。下面有更多详细信息。
将此添加到您的 composer.json 中,然后运行 composer update
"require": {
"silex/silex": "1.0.*@dev"
, "doctrine/dbal": "~2.2"
, "symfony/security": "~2.1"
, "symfony/twig-bridge": "~2.1"
, "jasongrimes/silex-simpleuser": "~0.6.3"
}
将此添加到您的 Silex 应用程序中
use Silex\Provider;
$app->register(new Provider\DoctrineServiceProvider(), array('db.options' => array(
'driver' => 'pdo_mysql',
'dbname' => 'my_app',
'host' => 'localhost',
'user' => 'mydbuser',
'password' => 'mydbpassword',
)));
$app->register(new Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'secured_area' => array(
'pattern' => '^.*$',
'anonymous' => true,
'remember_me' => array(),
'form' => array(
'login_path' => '/user/login',
'check_path' => '/user/login_check',
),
'logout' => array(
'logout_path' => '/user/logout',
),
'users' => $app->share(function($app) { return $app['user.manager']; }),
),
),
));
// Note: As of this writing, RememberMeServiceProvider must be registered *after* SecurityServiceProvider or SecurityServiceProvider
// throws 'InvalidArgumentException' with message 'Identifier "security.remember_me.service.secured_area" is not defined.'
$app->register(new Provider\RememberMeServiceProvider());
// These services are only required if you use the optional SimpleUser controller provider for form-based authentication.
$app->register(new Provider\SessionServiceProvider());
$app->register(new Provider\ServiceControllerServiceProvider());
$app->register(new Provider\UrlGeneratorServiceProvider());
$app->register(new Provider\TwigServiceProvider());
// Register the SimpleUser service provider.
$app->register($u = new SimpleUser\UserServiceProvider());
// Optionally mount the SimpleUser controller provider.
$app->mount('/user', $u);
创建用户数据库
mysql -uUSER -pPASSWORD MYDBNAME < vendor/jasongrimes/silex-simpleuser/sql/mysql.sql
现在您应该能够在 /user/register URL 创建账户。通过直接在数据库中编辑记录并将 users.roles 列设置为 ROLE_USER,ROLE_ADMIN 来将新账户设置为管理员。(在您有一个管理员账户后,它可以通过网络界面将管理员角色授予其他人。)
或者,您可以使用用户管理器创建管理员账户
$user = $app['user.manager']->createUser('test@example.com', 'MySeCrEtPaSsWoRd', 'John Doe', array('ROLE_ADMIN'));
$app['user.manager']->insert($user);
要求
SimpleUser 依赖于 DoctrineServiceProvider。(这提供了一个基本的 DBAL--数据库抽象层--而不是完整的 Doctrine 2 ORM。)
此外,如果您想使用可选的控制器提供者来设置基于表单的认证和用户管理的简单路由,还需要 Session、Service Controller、Url Generator 和 Twig 服务提供者。
这些都是 Silex 的标准发行版的一部分,除了一些 Twig 功能之外,必须在 composer.json 中将其作为依赖项添加,如下所示
"require": {
"symfony/twig-bridge": "~2.1"
}
启用 Doctrine 的类似功能
use Silex\Provider;
$app->register(new Provider\DoctrineServiceProvider(), array('db.options' => $config['db']));
启用类似这样的附加服务提供者
$app->register(new Provider\SessionServiceProvider());
$app->register(new Provider\ServiceControllerServiceProvider());
$app->register(new Provider\UrlGeneratorServiceProvider());
$app->register(new Provider\TwigServiceProvider());
安装 SimpleUser
将 jasongrimes/silex-simpleuser 依赖项添加到您的 composer.json 文件的 requires 部分。
在 MySQL 中创建用户数据库(在用 composer 下载包后)
mysql -uUSER -pPASSWORD MYDBNAME < vendor/jasongrimes/sql/mysql.sql
在您的 Silex 应用程序中注册该服务
$userServiceProvider = new SimpleUser\UserServiceProvider();
$app->register($userServiceProvider);
现在以下服务将可用
user.manager:一个用于管理User的服务。它是一个SimpleUser\UserManager的实例。user:代表当前已认证用户的User实例(如果用户未登录,则为null)。user.controller:一个包含处理用户管理路由操作的控制器。请参阅下面的“使用控制器提供者”。
配置安全服务以使用 SimpleUser 用户提供者
要将 Silex 安全服务配置为使用 SimpleUser\UserManager 作为其用户提供者,请将 users 键设置为如下所示的 user.manager 服务
$app->register(new Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'secured_area' => array(
'users' => $app->share(function($app) { return $app['user.manager']; }),
// ...
),
),
));
使用控制器提供者
除了注册服务外,SimpleUser\UserServiceProvider 还充当控制器提供者。它定义了一些可用于登录和管理用户的路由。
您可以这样挂载用户路由
// Register SimpleUser services.
$userServiceProvider = new SimpleUser\UserServiceProvider();
$app->register($userServiceProvider);
// Mount SimpleUser routes.
$app->mount('/user', $userServiceProvider);
以下路由可用。(在这个例子中,它们挂载在 /user 下,但可以通过更改上面的 mount() 参数来更改。)
配置防火墙以使用这些路由进行基于表单的认证。(将 /user 替换为您在上面的 mount() 中使用的挂载点。)
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'secured_area' => array(
'pattern' => '^.*$',
'anonymous' => true,
'form' => array(
'login_path' => '/user/login',
'check_path' => '/user/login_check',
),
'logout' => array(
'logout_path' => '/user/logout',
),
'users' => $app->share(function($app) { return $app['user.manager']; }),
),
),
));
自定义视图
更改布局模板
视图脚本都扩展了一个提供页面布局的基本 Twig 模板。默认情况下,此布局模板设置为 @user/layout.twig,存储在 src/SimpleUser/views/layout.twig 中。您几乎肯定会想要更改它。创建自己的 Twig 布局模板(从默认模板复制和粘贴,如有必要),然后在用户控制器中设置新模板。
$app['user.controller']->setLayoutTemplate('mylayout.twig');
$app['user.controller']->setEditTemplate('myedit.twig');
$app['user.controller']->setListTemplate('mylist.twig');
$app['user.controller']->setLoginTemplate('mylogin.twig');
$app['user.controller']->registerTemplate('myregister.twig');
$app['user.controller']->setViewTemplate('myview.twig');
访问控制
SimpleUser\UserServiceProvider 设置了自定义访问控制属性,用于测试查看者是否可以编辑用户。
EDIT_USER:当前用户是否允许编辑指定的用户对象。EDIT_USER_ID:当前已认证的用户是否允许编辑具有给定用户 ID 的用户。这对于在before()中间件中控制访问很有用。
默认情况下,用户可以编辑自己的用户账户,并且具有 ROLE_ADMIN 的用户可以编辑任何用户。通过重写 SimpleUser\EditUserVoter 来更改这些权限。
在控制器中,可以这样控制访问
// Test if the viewer has access to edit the given $user
if ($app['security']->isGranted('EDIT_USER', $user)) { ... }
// You can also test access by user ID without instantiating a User, ex. in a before() middleware
$app->post('/user/{id}/edit', 'user.controller:editAction')
->before(function(Request $request) use ($app) {
if (!$app['security']->isGranted('EDIT_USER_ID', $request->get('id')) {
throw new AccessDeniedException();
}
});
在 Twig 模板中,可以这样控制访问
{% if is_granted('EDIT_USER', user) %}
...
{% endif %}