OrmAuth 用法

如 Auth 套件中的 简介 所述,一套認證系统有三種不同的驅动, 每一種处理系统的一部分:

Ormauth login 驅动提供了建立、更新、刪除和驗證儲存在本地資料庫表的使用者帳號、 取得關於那些帳號的資訊、產生或重設密码、 以及登入和登出操作(建立一个使用者 session)的邏輯。

Ormauth group 驅动在資料庫中儲存其群組定義,透過 ORM 存取。 它提供檢查使用者是否为群組中一員的邏輯,并且檢索群組資訊,或定義給群組的角色。

Ormauth acl 驅动是角色驅动的,并在資料庫中儲存其 ACL 定義,透過 ORM 存取。 它提供檢查使用者是否有存取 ACL 具名權限的邏輯。

靜態 vs 动態

如同简介中所解釋,Auth 套件提供一个靜態介面让大多数方法可用,只提供你单一驅动組。 这些方法会在以下被定義为「靜態:是」。所有方法也可以经由 Auth 實例物件或 Auth 驅动實例物件鍊結存取, 包括那些标記为靜態的。

类別方法

validate_user($username_or_email = '', $password = '')

validate_user 方法驗證使用者憑證。此方法支援 Email 和使用者名稱做为有效憑據。

靜態
參数
參数 預設 描述
$username_or_email
''
使用者名稱或 Email 地址
$password
''
使用者密码
回傳 混合。false 如果使用者沒通過驗證,或一个有該使用者資訊的 \Model\Auth_User 實例,如果憑證有效的話。
範例
// 驗證使用者名稱和密码
if ($user = Auth::validate_user($name, $pass))
{
	// $name 和 $pass 的組合通過驗證,印出使用者名稱
	echo $user->username;
}

这个方法只驗證所給的使用者名稱及密码的組合是否正確。它登入使用者!

login($username_or_email = '', $password = '')

login 方法执行一个登入請求。如果有參数沒給,它会试圖從 post 資料檢索, 使用配置在 ormauth.php 配置档案中的表单欄位名稱。 在嘗试登入之前,內部它呼叫 validate_user() 方法來驗證請求。

靜態
參数
參数 預設 描述
$username_or_email
''
使用者名稱或 Email 地址
$password
''
使用者密码
回傳 布林。回傳 true 如果登入成功,否則是 false
範例
// 执行登入
if (Auth::login($name, $pass))
{
	// 該使用者成功登入
}

在成功登入後,'username' 和目前的 'login_hash' 将可用做一个 session 變数。

check()

check 方法檢查是否存在登入的使用者。

靜態
參数
回傳 布林。回傳 true 如果存在登入的使用者,否則是 false
範例
// login 如果我們沒登入
if ( ! Auth::check())
{
	Response::redirect('/login');
}

force_login($user_id = '')

force_login 方法执行一个強制登入請求。你可以用它來自动登入, 在你知道使用者 ID,但不知道密码時。例如,这可被用做一个「記住我」功能。

靜態
參数
參数 預設 描述
$user_id 必要 你想要登入的使用者 ID,或一个有效的 \Model\Auth_User 實例
回傳 布林。回傳 true 如果登入成功,否則是 false
範例
// 为使用者 12121 执行強制登入
if (Auth::force_login(12121))
{
	// 該使用者成功登入。任何先前登入的使用者会被登出!
}

// 为使用者物件 12121 执行強制登入
$user = \Model\Auth_User::find(12121);
if (Auth::force_login($user))
{
	// 該使用者成功登入。任何先前登入的使用者会被登出!
}

logout()

logout 方法登出目前登入的使用者。

靜態
參数
回傳 布林。回傳 true 如果登入成功,否則是 false
範例
// 执行登出
Auth::logout();

如果你已经啟用支援訪客使用者,訪客使用者将在成功登出之後被設置。

create_user($username, $password, $email, $group = 1, Array $profile_fields = array())

create_user 能让你在使用者資料表建立一筆新的使用者紀錄。

靜態
參数
參数 預設 描述
$username 必要 你想要建立的使用者名稱
$password 必要 你想要指派給該使用者的密码
$email 必要 你想要建立的使用者 Email 地址
$group 1 你想要指派此使用者的群組。預設情況下,使用者被指派到群組 1。
$profile_fields
array()
你想要指派給此使用者的任何附加設定档欄位
拋出 SimpleUserUpdateException
回傳 混合。回傳建立使用者紀錄的 ID,或 false 如果建立失敗。
範例
// 建立新使用者
Auth::create_user(
	'anewuser',
	'thisismysecretpassword',
	'anewuser@example.org',
	1,
	array(
		'fullname' => 'A. New User',
	)
);

$profile_fields 參数是为 Simpleauth API 相容性定義。 該欄位在 user 資料表中沒使用,任何傳遞的詮釋資料会儲存在 metadata 資料表。

update_user($values, $username = null)

update_user 方法能让你更新使用者紀錄中的值, 無論是具名的,或目前登入的使用者。

靜態
參数
參数 預設 描述
$values
array()
你想要更新的行或設定档欄位的行名/值配對的關聯陣列。
$username
null
你想要更新的使用者的名稱
拋出 SimpleUserUpdateException
回傳 布林。回傳 true 如果行被更新,或 false 如果沒有行被影響。
範例
// 为目前使用者更新資料
Auth::update_user(
	array(
		'email'        => 'anewemail@example.org',  // 設定一个新的 Email 地址
		'password'     => 'thisismynewpassword',    // 設定一个新密码
		'old_password' => 'thisismysecretpassword', // 要这樣做,給目前的密码!
		'phone'        => '+1 (555) 123-1212',	    // 并且添加電話號码到詮釋資料
	)
);

这个方法主要是提供給使用者更新个人資料。并且做为安全措施,它允許你變更使用者名稱, 而且如果你想變更密码,你必須在 $values 中傳遞目前密码做为 "old_password"。

change_password($old_password, $new_password, $username = null)

The change_password 方法能让你變更一个使用者密码。

靜態
參数
參数 預設 描述
$old_password 必要 使用者目前密码
$new_password 必要 使用者新密码
$username
null
你想要變更密码的使用者名稱
拋出 SimpleUserUpdateException
回傳 布林。回傳 true 如果密码被變更,或 false 如果就密码不正確。
範例
// 为目前使用者重置密码
Auth::change_password('thisismynewpassword','thisismysecretpassword');

这个方法是提供給使用者變更他的密码。并且做为安全措施, 你 必須 在 "old_password" 傳遞目前密码。

reset_password($username)

reset_password 方法能让你指派一个新的隨機密码給使用者。

靜態
參数
參数 預設 描述
$username 必要 你想要重設密码的使用者名稱
拋出 SimpleUserUpdateException
回傳 字串,產生的隨機密码。
範例
// 为目前使用者重設密码
$new_password = Auth::reset_password('thisusername');

delete_user($username)

delete_user 方法能让你刪除一个使用者帳號。

靜態
參数
參数 預設 描述
$username 必要 你想要刪除的使用者帳號名稱
拋出 SimpleUserUpdateException
回傳 布林。回傳 true 如果使用者帳號被刪除,或 false 如果失敗的話(因为使用者名稱不存在)。
範例
// 刪除使用者
Auth::delete_user('thisusername');

这也会刪除所有詮釋資料,使用 ORM 的 cascade_delete 特性。

create_login_hash()

create_login_hash 方法为目前登入使用者產生一个新的登入雜湊。

靜態
參数
回傳 字串,產生的登入雜湊。
範例
// 產生一个新的隨機雜湊
Auth::create_login_hash();

这个方法通常用在使用者登入,但你可以使用它定期轉动登入使用者的雜湊, 來做为額外的安全措施。

請注意,登入雜湊保護在多个登入啟用時不会使用!

get($field, $default = null)

get 方法是使用者特性的通用 getter,無論是從使用者紀錄,或是從詮釋資料。

靜態
參数
參数 預設 描述
$field 必要 你想要取得值的特性名稱
$default
null
如果特性沒設定要回傳的值
回傳 mixed.
範例
// 取得使用者建立日期
$created_at = Auth::get('created_at');

get_user_id()

get_user_id 方法回傳一个包含驅动 ID 值、以及目前登入使用者 ID 的陣列結構。 它使用这个結構因为你可以有多个活躍的 login 驅动, 每一个可以對目前登入使用者有不同 ID。

靜態
參数
回傳 混合。回傳一个 array([0]=>driver_id, [1]=>user_id) 形式的数字陣列如果使用者登入的話,否則是 false
範例
// 取得所有登入 ID 資訊
$id_info = Auth::get_user_id();

// 印出驅动和 ID 資訊
if ($id_info)
{
	foreach ($id_info as $info)
	{
		echo 'Driver: ',$info[0],' with ID ',$info[1],'<br />';
	}
}
else
{
	echo 'Nobody is logged in!';
}

// 如果你只使用一个驅动,你也可以这樣做
list($driver, $userid) = Auth::get_user_id();

// 或这樣如果你只需要 userid
list(, $userid) = Auth::get_user_id();

如果啟用訪客登入支援,你将永遠取不到 false 回傳,因为該方法将回傳訪客使用者的使用者 ID。

get_groups()

get_groups 方法回傳指派給目前登入使用者的 ORM 使用者群組物件。

靜態
參数
回傳 混合。回傳一个 array(array(driver, group-object)) 形式的陣列如果使用者登入的話,否則是 false
範例
// 取得所有群組 ID 資訊
$id_info = Auth::get_groups();

// 印出驅动和 ID 資訊
if ($id_info)
{
	foreach ($id_info as $info)
	{
		echo 'Driver: ',$info[0],' with group ID ',$info[1]->id,'<br />';
	}
}
else
{
	echo 'Nobody is logged in!';
}

// 如果你只使用一个驅动,你也可以这樣做
list($driver, $group) = Auth::get_groups();
echo 'Driver: ',$driver,' with group ID ',$group->id,'<br />';

如果啟用訪客登入支援,你将永遠取不到 false 回傳,因为該方法将回傳訪客使用者的群組資訊。

get_email()

get_email 方法回傳指派給目前登入使用者的 Email 地址。

靜態
參数
回傳 混合。回傳一个 Email 地址如果使用者有登入,或 false 如果沒有使用者登入。
範例
// 取得目前使用者的 Email 地址
$email = Auth::get_email();

// 請注意,false 和 empty 之間有所不同:
if ($email === false)
{
	// 沒有人登入
}
if (empty($email))
{
	// 使用者已登入,但沒有 Email 地址
}

如果啟用訪客登入支援,你将永遠取不到 false 回傳,因为該方法将回傳訪客使用者的 Email 地址。

get_screen_name()

get_screen_name 方法回傳目前登入使用者的螢幕或顯示名稱。

靜態
參数
回傳 混合。回傳包含名稱的字串,或 false 如果沒有使用者登入。
範例
// 取得目前使用者的螢幕名稱
$name = Auth::get_screen_name();

// 名稱是必要的,所以如果沒出现,表示沒有人登入
if (empty($name))
{
	// 沒有人登入
}

如果啟用訪客登入支援,你将永遠取不到 false 回傳,因为該方法将回傳訪客使用者的使用者名稱。

get_profile_fields($field = null, $default = null)

get_profile_fields 方法回傳登入使用者的一个或所有儲存个人設定欄位。

靜態
參数
參数 預設 描述
$field
null
你想要取得个人設定欄位的名稱。
$default
null
如果請求的个人設定欄位不存在時,你想要回傳的值。
回傳 混合
範例
// 取得所有定義的个人設定欄位
$profile = Auth::get_profile_fields();

// 取得指定定義的个人設定欄位
$fullname = Auth::get_profile_fields('fullname', 'Unknown');

// 会回傳 null,因为 username 不是詮釋資料的一部分
$fullname = Auth::get_profile_fields('username', 'Unknown username');

member($group, $user = null)

member 方法能让你檢查使用者是否为所給群組的一員。

靜態
參数
參数 預設 描述
$group 必要 你想要檢查成員資格的群組 ID,或一个有效的 \Model\Auth_Group 實例。
$user
null
指定的使用者,透過 get_user_id() 的結果識別,或 null 为目前登入的使用者。
回傳 布林。true 如果使用者是群組成員,否則是 false
範例
// 檢查目前使用者是否为管理員
if (Auth::member(100))
{
	// 我們在管理員群組!
}

// 檢查目前使用者是否为管理員
$group = \Model\Auth_Group::find(100);
if (Auth::member($group))
{
	// 我們在管理員群組!
}

groups($driver = null)

groups 方法能让你取回所有定義的群組,或所有定義在指定驅动中的群組。

靜態
參数
參数 預設 描述
$driver
null
你想要從中取得群組的 group 驅动名稱
回傳 \Model\Auth_Group 物件的陣列。如果 group 驅动不存在或沒定義群組,会回傳空陣列。
範例
// 取得所有定義的群組(所有載入的 group 驅动)
$groups = Auth::groups();

// 從預設 group 驅动取得所有群組
$groups = Auth::group()->groups();

// 從指定驅动取得所有群組
$groups = Auth::group('Ormgroup')->groups();

如果你想要透過指定驅动定義群組,你需要在 Auth group 驅动實例呼叫此方法。

如果你使用多个驅动,此方法只適用於如果群組 ID 在所有驅动確實是唯一的!

roles($driver = null)

roles 方法能让你取回所有定義的角色,或所有定義在指定驅动中的角色。

靜態
參数
參数 預設 描述
$driver
null
你想要從中取得角色的 group 驅动名稱
回傳 \Model\Auth_Roles 物件的陣列。如果 acl 驅动不存在或沒定義角色,会回傳空陣列。
範例
// 取得所有定義的角色(所有載入的 acl 驅动)
$roles = Auth::roles();

// 從預設 acl 驅动取得所有角色
$roles = Auth::acl()->roles();

// 從指定驅动取得所有角色
$roles = Auth::acl('Ormacl')->roles();

如果你想要透過指定驅动定義群組,你需要在 Auth acl 驅动實例呼叫此方法。

如果你使用多个驅动,此方法只適用於如果角色 ID 在所有驅动確實是唯一的!

get_name($group = null)

get_name 方法能让你取回指定群組的名稱。如果沒給 group, 它会回傳目前登入使用者的群組名稱。

靜態
參数
參数 預設 描述
$group
null
你想要從中取得名稱的群組 ID
回傳 混合。群組名稱,或 null 如果所給群組 ID 不存在。
範例
// 取得目前登入使用者所有群組的名稱
$name = Auth::group()->get_name();

// 取得來自指定驅动指定群組的名稱
$name = Auth::group('Ormgroup')->get_name(100);	// 回傳 'Administrators'

如果你使用多个驅动,此方法只適用於如果群組 ID 在所有驅动確實是唯一的!

has_access($condition)

has_access 方法能让你檢查目前登入的使用者,是否有存取指定位置的指定權限。

靜態
參数
參数 預設 描述
$condition 必要 你想要檢查的存取條件
回傳 布林。true 如果使用者可存取,否則为 false
範例
// 檢查使用者是否有閱讀 blog 文章的存取權限
if (Auth::has_access('blog.comments'))
{
	// 是的,使用者可存取
}

// 如果你有多个實例,使用該實例呼叫此方法。
// 你也可以一次檢查多个權限
if (Auth::instance('Ormauth')->has_access('blog.[posts,comments]'))
{
	// 是的,使用者有 blog 文章和評論兩者的存取權限
}

// 你也可以指定權限为陣列來檢查
if (Auth::has_access(array('blog' => array('post'), 'comments' => array('post')))
{
	// 是的,使用者有閱讀 blog 和評論文章兩者的存取權限
}

// 如果你有多个 login 實例,你也可以取指定的 ACL 驅动
if (Auth::acl('Ormacl')->has_access('blog.[posts,comments]'))
{
	// 是的,使用者有 blog 文章和評論兩者的存取權限
}

// 你可以透過使用權限动作來取得更細緻的權限
if (Auth::has_access('blog.comments[read,create,update,delete]'))
{
	// 是的,使用者有全部的 blog 評論存取權限
}

guest_login()

guest_login 方法能让你檢查訪客存取是否啟用。

靜態
參数
回傳 布林。回傳 true 如果支援訪客啟用,否則是 false
範例
// 重導到 login 如果我們要求一个使用者且訪客存取沒有啟用
if ( ! Auth::check() and ! Auth::guest_login())
{
	Response::redirect('/login');
}

remember_me($user_id = null)

remember_me 方法能让你設定一个 remember_me cookie。如果沒給 $user_id,会使用目前登入的使用者。

靜態
參数
參数 預設 描述
$user_id
null
要被記住的使用者 ID
回傳 布林。回傳 true 如果記住我 cookie 有正確設定,或 false 如果沒有 user_id 存在,或 remember_me 功能在配置中被停用。
範例
// 处理登入表单 POST,并設定 remember-me cookie 如果需要
if (\Input::method() == 'POST')
{
	// 檢查憑證。
	if (\Auth::instance()->login(\Input::param('username'), \Input::param('password')))
	{
		// 使用者想被記住嗎?
		if (\Input::param('rememberme', false))
		{
			// 建立 remember-me cookie
			\Auth::remember_me();
		}
		else
		{
			// 如果存在,刪除 remember-me cookie
			\Auth::dont_remember_me();
		}

		// 登入,往首頁去
		\Response::redirect('/');
	}
	else
	{
		// 登入失敗,顯示一个错误訊息
		$data['username']    = \Input::param('username');
		$data['login_error'] = \Lang::get('login.failure');
	}
}

dont_remember_me()

dont_remember_me 方法銷毀 remeber_me cookie,如果存在的話。

靜態
參数
範例 範例見 remember_me()