shanehudson/wordpress-auth-laravel

Laravel 5 的 WordPress 认证驱动

2.1.0 2014-07-10 09:41 UTC

This package is not auto-updated.

Last update: 2024-10-02 09:56:16 UTC


README

允许您使用 WordPress 安装的用户表进行用户认证

作者:Simon Hampel

安装

推荐通过 Composer 安装

在您的 composer.json 中通过 Composer 需求此包

:::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 并更新需求行到 "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 应用程序之间的混淆或潜在的表名冲突。

即使您在 WordPress 数据库中没有其他 Laravel 应用程序的表,我们也建议您创建上述的两个数据库连接,这样如果您打算使用我们提供的迁移来创建认证功能所需的额外表,您可以保持迁移表分离。

接下来,如果您尚未实施,请使用 artisan 命令发布可配置用户模型包配置文件

:::bash $ php artisan user:config

(另外,您还可以使用命令 php artisan config:publish hampel/user)

配置 app/config/packages/hampel/user/config.php,

  1. connection 设置为之前为用户管理数据库设置的数据库连接名称(例如:mysql-wordpress)。如果将其设置为 'default',它将使用与主应用程序相同的数据库连接。
  2. 将 __id_field__ 设置为 'ID'(大写字母很重要!)
  3. 将 __username_field__ 设置为 'user_login'
  4. 将 __email_field__ 设置为 'user_email'
  5. 将 __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 安装添加一些新的数据库表,例如用于使“记住我”cookie工作的 remember_tokens。

提供了一些迁移来帮助设置这些表,输入以下命令

:::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 功能,它们使用上述相同的选项。

用法

按照正常流程,在 Laravel 应用程序中实现用户认证,请参照 https://laravel.net.cn/docs/security 中的说明。

提供了一个 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 服务提供外观
  • 可能需要公开 WordPress 用户元数据
  • 既然我们提到了这一点,为什么不公开 WordPress 角色呢?