hampel / wordpress-auth-laravel
Laravel WordPress Auth 驱动器
Requires
- php: >=5.3.0
- hampel/user: >=1.0,<3.0
- hautelook/phpass: 0.3.*
- illuminate/auth: >=4.1.29,~4.1
- illuminate/config: ~4.1
- illuminate/hashing: ~4.1
- illuminate/support: ~4.1
Requires (Dev)
- mockery/mockery: dev-master@dev
README
允许您通过WordPress安装的用户表对用户进行认证
由Simon Hampel提供。
安装
推荐的安装方式是通过Composer
通过Composer在您的composer.json
中要求此包
:::json
{
"require": {
"hampel/wordpress-auth-laravel": "~2.0"
}
}
运行Composer以更新新需求。
:::bash
$ composer update
从v1.x升级
虽然v2.x提供的功能与v1.x相同,但在升级时需要做出一些相当重要的配置更改。这也会可能影响到您编写的代码,因此请务必更新任何读取此包配置文件的代码。
对于v2.0,我们现在已经实现了我们的可配置用户模型 - hampel/user,它为在用户数据库不遵循使用用户名和密码进行认证的标准约定的情况下使用的应用程序提供了一个灵活的基础模型。
因此,之前在app/config/packages/hampel/wordpress-auth-laravel/auth.php
中的大部分配置现在都由用户模型的配置提供。
要升级,首先更改composer.json
并将require行更新为"hampel/wordpress-auth-laravel": "~2.0"
。
运行Composer以更新新需求。
:::bash
$ composer update
将ValidateServiceProvider和UserServiceProvider提供者添加到app/config/app.php
中的提供者数组中 - 确保它们在WordPressAuthServiceProvider和WordPressHashServiceProvider条目之前添加
:::php
'providers' => array(
...
'Hampel\Validate\Laravel\ValidateServiceProvider', // <---- new entry
'Hampel\User\UserServiceProvider', // <---- new entry
'Hampel\WordPress\Auth\WordPressAuthServiceProvider',
'Hampel\WordPress\Hashing\WordPressHashServiceProvider',
),
接下来,运行Composer以使Laravel更新其服务列表,包括新的提供者
:::bash
$ composer dump
如果您之前没有实施hampel/user包,可以使用以下命令发布其配置
:::bash $ php artisan user:config
(或者,您可以使用命令php artisan config:publish hampel/user
)
按照以下配置说明更新可配置用户模型配置。您将从旧的app/config/packages/hampel/wordpress-auth-laravel/auth.php
配置文件中复制许多选项。
删除auth.php配置文件 - 它不再使用
:::bash
$ rm app/config/packages/hampel/wordpress-auth-laravel/auth.php
将hashing.php配置文件重命名为hash.php
:::bash
$ cd app/config/packages/hampel/wordpress-auth-laravel
$ mv hashing.php hash.php
从包中复制新的database.php配置文件
:::bash
$ cp vendor/hampel/wordpress-auth-laravel/src/config/database.php app/config/packages/hampel/wordpress-auth-laravel/
别忘了更改任何您可能创建的环境特定版本的配置文件。
最后,WordPressUser类已移动,现在位于Hampel\WordPress\Auth\Models\WordPressUser
中。您需要更新扩展此类的任何模型代码,或者如果您直接使用此用户模型,则需要更新app/config/auth.php
中的认证配置。
:::php
'model' => 'Hampel\WordPress\Auth\Models\WordPressUser',
请参阅以下使用示例,了解如何使用此包实现认证。
配置
打开您的Laravel配置文件app/config/app.php
,并在提供者数组中添加以下服务提供者,如果它们尚未存在
:::php
'providers' => array(
...
'Hampel\Validate\Laravel\ValidateServiceProvider',
'Hampel\User\UserServiceProvider',
'Hampel\WordPress\Auth\WordPressAuthServiceProvider',
'Hampel\WordPress\Hashing\WordPressHashServiceProvider',
),
WordPressAuthServiceProvider是Auth服务扩展新"wordpress"用户提供者的地方。
WordPressHashServiceProvider提供一个新的"wordpress-hash"服务,它使用与WordPress相同的库来散列值。
ValidateServiceProvider为我们提供了检查数据的一些额外工具,而UserServiceProvider则提供了一个可配置的用户模型,这使得我们能够轻松地与不遵循标准用户名和密码字段命名约定的数据库进行交互。
打开Laravel配置文件app/config/auth.php
,将驱动设置为wordpress
,将模型设置为'Hampel\WordPress\Auth\WordPressUser'
:::php
'driver' => 'wordpress',
'model' => 'Hampel\WordPress\Auth\Models\WordPressUser',
或者,如果您有自定义用户模型,应将其扩展为Hampel\WordPress\Auth\Models\WordPressUser
,并在认证配置文件中指定您的用户模型名称。
您可以在配置文件中将table
设置为users
,这将对应于WordPress数据库中的wp_users
表,假设数据库连接的前缀已设置为wp_
,如下面的数据库配置选项所示。
您必须配置数据库连接,以便用户模型可以找到WordPress表。您可以使用默认连接或指定用于WordPress认证的附加连接。
要创建新的数据库连接,编辑或覆盖app/config/database.php
中的设置。例如,要创建新的连接mysql-wordpress
:::php
'mysql-wordpress' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'wordpress',
'username' => '',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => 'wp_',
),
确保表前缀与您的WordPress wp-config.php
文件中指定的值相同,默认为
:::php
$table_prefix = 'wp_';
即使您的Laravel数据与WordPress存储在同一个数据库中,如果您的WordPress使用与Laravel表不同的表前缀(这很可能是情况),您也应按照上述说明在Laravel中指定新的数据库连接,以便设置前缀。
实际上,我们建议使用两个连接 - 为您的应用程序使用默认连接(您喜欢的前缀或根本不使用),并为WordPress使用第二个自定义连接,表前缀为wp_
(或您的wp-config.php
文件中的表前缀)。这允许您在数据库中将这两组表分开,并最小化WordPress和您使用的任何WordPress插件与Laravel应用程序之间的混淆或潜在表名冲突。
即使您的Laravel应用程序在WordPress数据库中没有其他表,我们也建议您创建上述所述的两个数据库连接,以便如果您打算使用我们的迁移来创建认证功能所需的附加表,可以单独保留迁移表。
接下来,如果您还没有实施它,请使用Artisan命令发布可配置用户模型包的配置文件
:::bash $ php artisan user:config
(或者,您可以使用命令php artisan config:publish hampel/user
)
配置app/config/packages/hampel/user/config.php
,
- 将
connection
设置为之前为用户管理数据库设置的数据库连接名称(例如:mysql-wordpress
)。如果您将其设置为'default'
,它将使用与您的应用程序相同的主数据库连接。 - 将__id_field__设置为
'ID'
(大写字母很重要!) - 将__username_field__设置为
'user_login'
- 将__email_field__设置为
'user_email'
- 将__password_field__设置为
'user_pass'
这些字段名称对应于WordPress在wp_users表中用于认证的字段名称。
例如
:::php
'connection' => 'mysql-wordpress',
'id_field' => 'ID',
'username_field' => 'user_login',
'email_field' => 'user_email',
'password_field' => 'user_pass',
我们需要向WordPress安装添加一些新的数据库表以实现某些认证相关功能,例如添加remember_tokens以使“记住我”cookie正常工作。
提供了迁移来帮助设置这些表,输入以下命令
:::bash
$ php artisan migrate --package="hampel/wordpress-auth-laravel"
注意,如果您希望迁移表(管理迁移过程)使用除默认连接以外的连接(例如,您希望迁移表类似于wp_migrations),您应指定连接名称作为选项。
例如,要使用名为'mysql-wordpress'的数据库连接,使用以下命令
:::bash
$ php artisan migrate --package="hampel/wordpress-auth-laravel --database="mysql-wordpress"
这将不会更改安装实际认证相关表所使用的连接 - 那些表将自动使用配置选项user::connection
中指定的数据库连接。
如果需要使用,"migrate:rollback" 和 "migrate:reset" 函数使用与上述相同的选项。
使用方法
按照 https://laravel.net.cn/docs/security 中的说明,正常实现 Laravel 应用程序的用户认证。
提供了一个名为 Hampel\WordPress\Auth\WordPressUser
的模型,用于替换 Laravel 提供的默认 User
模型。
要传递给 Auth::attempt
函数的用户数据必须使用 "user_login" 作为用户名键,以匹配 WordPress 中的对应列名。然而,密码必须使用 "password" 键,不管怎样(认证函数将查询模型以找到实际的密码字段名)。例如
:::php
$userdata = array(
'user_login' => Input::get('username'),
'password' => Input::get('password')
);
if (Auth::attempt($userdata))
{
// successfully logged in
}
else
{
// authentication failed
}
已提供配置值以使用这些列名(尽管它们不太可能更改,如果您愿意,也可以将它们硬编码),因此您也可以使用类似以下的内容
:::php
$userdata = array(
Config::get('user::username_field') => Input::get('username'),
'password' => Input::get('password')
);
注意
当使用非默认连接进行认证时,尝试使用 Laravel 验证服务验证认证数据将失败。您需要显式地将验证器的连接名称设置为配置用户模型时使用的名称。
以下示例显示了如何验证从表单中 POST 的用户名和密码。请注意,我们正在使用来自 hampel/validate-laravel-auth 包的自定义 "auth" 验证规则。这是可选的,如果选择,您可以完全省略 "auth" 规则。我编写了该包以帮助验证认证数据,这样在登录表单中,您可以轻松地返回一个错误消息,指出提供的密码无效,并要求用户重新提交表单。
:::php
$username = Input::get('username'); // from our form
$password = Input::get('password'); // from our form
$user_table = Config::get('auth.table'); // from the Laravel auth configuration
$connection = Config::get('user::connection'); // from the User configuration
$username_field = Config::get('user::username_field'); // from the User configuration
$password_field = Config::get('user::password_field'); // from the User configuration
$userdata = array(
'username' => $username,
'password' => $password
);
// Declare the rules for the form validation.
$rules = array(
'username' => array('required', "exists:{$user_table},{$username_field}"),
'password' => array('required', "auth:{$username_field},{$username}")
);
$validator = Validator::make($userdata, $rules); // create our validator
$validator->getPresenceVerifier()->setConnection($connection); // <---- THIS IS THE MISSING MAGIC for when we are using a non-default connection
// Check if the form validates with success.
if ($validator->passes())
{
$credentials = array(
$username_field => $username,
'password' => $password
);
if (Auth::attempt($credentials))
{
dd("auth successful");
}
else
{
dd("auth failed");
}
}
dd("validation failed");
待办事项
- 需要更多的单元测试
- 密码提示 - 我们应该做还是留给 WordPress 处理?
- WordPress-hash 服务的 Facade
- 可能需要公开 WordPress 用户元数据
- 既然我们已经提到了,为什么不公开 WordPress 角色?