当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

简介 - OrmAuth - Auth 套件

优质
小牛编辑
118浏览
2023-12-01

Ormauth 是一组提供与 Simpleauth 类似功能的认证和授权驱动, 但储存其资料在资料库而非配置档案中。该资料透过 ORM 模型来存取。

除此之外,它还配备了额外的功能。不像 Simpleauth,Ormauth 支援直接指派角色给使用者, 并指派权限给使用者和群组,允许更加细緻的权限系统。 它不是把使用者的诠释资料储存在一个序列化的阵列,而是一张单独的诠释资料的资料表,使用 ORM 的 EAV 功能, 能让你像任何其他的使用者特性一样存取诠释资料。它也会追踪先前的登入时间, 它可以做为在登入时显示给使用者的一个额外的安全措施。

Auth 设置

配置开始于告知 Auth 套件你即将使用 Ormauth 驱动。 这是透过 auth.php 配置档案做到。预设档案在 Auth 套件中被提供。 在做任何变更前,你应该複製此档案到你的 app/config 文件夹。 预设档案已经为 Simpleauth 套件配置,所以你需要变更它。你将在此配置档案的这里找到说明。

在你完成后,你可以选择透过 app/config/config.php 的 always_load 段落来自动载入套件。

因为 OrmAuth 使用 ORM 来存取资料库,确保你也已经添加 'orm' 套件到 always_load 段落!

ACL

OrmAuth 有比 SimpleAuth 更细緻的 ACL 系统。它使用标准 ORM 关联来为任何所给的使用者建构权限组, 并有以下的结构:

  • 每个使用者是一个群组(对,就是一个)的一员
  • 每个使用者可以有零个或多个指派给它的角色
  • 每个群组可以有零个或多个指派给它的角色
  • 每个使用者可以有零个或多个指派给它的权限
  • 每个群组可以有零个或多个指派给它的权限
  • 每个角色可以有零个或多个指派给它的权限
  • 每个权限属于一个权限区域
  • 每个权限可以有零个或多个关联的动作

所有权限是每个使用者的集合。角色可以有特别的权限过滤器, 这可能改变指派集合的权限。他们是:

  • "All access",存为 "A"。有这个角色的使用者可以存取全部。这通常是用在 'super-admin' 角色。它推翻所有权限设定。
  • "No access",存为 "D"。有这个角色的使用者无法存取。这通常是用在 'banned' 角色。它推翻所有权限设定。
  • "Revoke permissions",存为 "R"。设定在此角色的权限会从集合权限设定中被移除。

请注意,"revoked" 权限在所有其他权限之前被检查。这能让你建立像这样的权限结构: 「这个 super-admin 可以存取全部,除了应用程序极机密的区域」……

指派权限是使用标准的 ORM 关联,而且非常直接了当:

// 取得识别为 $role_id 的角色
$role = \Model\Auth_Role::find($role_id);

// 取得识别为 $perm_id 的权限
$perm = \Model\Auth_Permission::find($perm_id);

// 关联两者
$role->permissions = $perm;

// 并保存关联
$role->save();

动作

如上所述,你可以透过添加一个权限的动作列表(区域和权限的组合)来添加额外的细緻度。

动作储存在权限纪录中做为一个字串阵列索引,透过 ORM 自动序列化和反序列化。 你可以尽量定义你想要的动作,并选择任何你喜欢的字串。如果需要, 这能让你以一个形式对每一个动作设定每个权限,更细緻的,在你任何可能需要的时候!

定义在权限上的动作列表在指派权限给一个使用者、一个群组、或一个角色时,指定可以被指派的可能动作。 指派的动作储存为一个键的阵列,它定义哪些动作被指派。

// 如果这些是可能的动作:
array('add', 'view', 'edit', 'delete')

// 然后你应该在指派 'view' 和 'edit' 时储存它:
array(1, 2)

要储存它,ORM 模型已经提供直接存取关联, 或透过不管是连结到 user、role 或 group 资料表的权限。

// 取得识别为 $role_id 的角色
$role = \Model\Auth_Role::find($role_id);

// 取得识别为 $perm_id 的权限
$perm = \Model\Auth_Permission::find($perm_id);

// 关联两者,添加部份选定的动作
$role->rolepermission[] = \Model\Auth_Rolepermission::forge(array(
	'role_id' => $role->id,
	'perms_id' => $perm->id,
	'actions' => array(1,2),
));

// 并保存关联
$role->save();

当检查存取时,你指定所需的存取为 area.permission 当你想要检查单一权限, area.[permission,permission,...] 当你想要一次检查多个权限, 或如果你想要检查关联动作,你可以使用 area.permission[action,action,...]。这是一个 AND 检查, 所以当你指定多个权限时,该使用者必须要有全部指派权限才能授权存取。 这能让你建构像 blog.comments[read,create,write,write-own,delete,delete-own] 的检查。

快取

为了减少资料库 I/O,OrmAuth 驱动大量使用快取,来避免登入的使用者在每个页面请求必须检索整个权限设定。 在你开始使用 OrmAuth 之前,确保你的快取配置已经设置。

所有快取条目带有定义在 OrmAuth 配置档案中的前缀。他们建立时没有过期时间戳记, 所以当你设计你的管理后端,确保在一个更新后有删除所需的快取条目,如此快取可以被刷新。

以下的快取键被 OrmAuth 使用:

  • <prefix>.groups - 所有定义群组的完整列表
  • <prefix>.roles - 所有定义角色的完整列表
  • <prefix>.permissions.user_<id> - 给使用者 <id> 的有效权限

在一个权限系统的更新后,确保清除快取的权限,并且,如果你有变更角色或群组定义, 也清除他们。

// 清除单一使用者(ID 12211)的权限
\Cache::delete(\Config::get('ormauth.cache_prefix', 'auth').'.permissions.user_12211');

// 清除所有快取的权限
\Cache::delete_all(\Config::get('ormauth.cache_prefix', 'auth').'.permissions');

// 清除所有快取的群组
\Cache::delete(\Config::get('ormauth.cache_prefix', 'auth').'.groups');

// 清除所有快取的角色
\Cache::delete(\Config::get('ormauth.cache_prefix', 'auth').'.roles');

配置

Ormauth 认证系统是透过一个配置档案来配置,不意外地称为 'ormauth.php'。 预设档案在 Auth 套件中有提供。 在你做任何变更前,你应该複製该档案到你的 app/config 文件夹。

以下配置值可以被定义:

参数类型预设描述
db_connection字串
null
要使用的资料库连线名称。这应该与你应用程序 db.php 配置档案中的定义相符。 设定它为 null 以使用预设 DB 实例。
table_name字串
'users'
要使用的使用者资料表名称。
table_columns阵列
array('*')
要从使用者资料表选择的行列表,或 '*' 来选择所有行。你必须至少包含 'username'、'password'、'email'、'last_login'、'login_hash'、'group' 和 'profile_fields'。
cache_prefix字串
'auth'
当快取 ORM 资料用在快取键的前缀。
guest_login布林
true
如果为 true,如果没有登入,假的 'guest' 使用者会被建立。 这能让你在没登入时使用群组和 acl 驱动。
remember_me阵列
array(
	'enabled' => false,
	'cookie_name' => 'rmcookie',
	'expiration' => 86400*31
)
给 Ormauth 'remember_me' 功能的配置
multiple_logins布林
false
如果为 true,多个相同使用者同时登入是允许的。如果为 false,当一个使用者登入,任何先前的登入会被取消。 注意启用这会停用一些登入 session 劫持的对策!
login_hash_salt字串
'put_some_salt_in_here'
为了让 OrmAuth 驱动使用的密码额外安全, 一个盐值被用在储存密码进资料库时杂凑他们。确保你变更预设值为一个非常随机的字串! 为了杂凑密码,OrmAuth 使用 PBKDF2,一个非常安全的杂凑机制。
username_post_key字串
'username'
在登入表单上包含使用者名称的输入栏位名称。
password_post_key字串
'password'
在登入表单上包含密码的输入栏位名称。

如果你想要使用 'remember-me' 功能,确保你有一个有效的 Crypt 配置, 因为它使用一个加密的 cookie 来储存要被记忆的使用者资讯。

资料库表

OrmAuth 依赖一张资料表,Auth 套件包含要建立此资料表所需的迁移档案。
只要运行 oil refine migrate --packages=auth 来为你建立这些资料表。

範例

这是一个简单的登入动作:

public function action_login()
{
	$data = array();

	// 如果你按下提交按钮,让我们跑整个步骤。
	if (Input::post())
	{
		// 检查认证,这里假设你已经建立上表,且
		// 你已经使用如上所述的资料表定义和配置。
		if (Auth::login())
		{
// 认证成功,进入。
Response::redirect('success_page');
		}
		else
		{
// 哎呀,没你的汤,再试着登入一次。设定一些值来
// 重填使用者名称栏位,并给一些错误的文字到检视。
$data['username']    = Input::post('username');
$data['login_error'] = 'Wrong username/password combo. Try again';
		}
	}

	// 显示登入表单。
	echo View::forge('auth/login',$data);
}