状态 Stub
Todo Define what is a login 'role' or make a link to related doc
Todo make better examples
官方最后更新时间 2009/02/02 09:52

Auth 扩展

Kohana Auth 扩展为网站的用户和权限鉴定提供一种简单易用的 API。它提供了内建的用户 Session,自动登录和密码加密。Auth 扩展基于驱动驱使,这可以让大家可以使用任何的插件进行验证 - 当前提供数据库和文件驱动。它不实现全功能登录,注册或密码恢复的功能,这些功能需求需按开发者继承这个扩展来完成。

注意:为了使得用户登录进去,用户至少需要设置一个登录权限。您可以为你的用户创建和分配任何其他的权限。

更多信息请参阅 模块(Modules)

配置

使用 Auth 扩展之前必须在 application/config/config.php 文件的 $config['modules'] 数组中开启此扩展:(去掉 MODPATH.'auth' 前面的注解符号)

$config['modules'] = array
(
	MODPATH.'auth',      // Authentication
	...
);

虽然你可以使用默认的配置驱使扩展,但是强烈推荐安装下面的要求来配置扩展参数:更多信息请参阅 配置(Configuration)Kohana 文件系统(Filesystem)

  • 复制 modules/auth/config/auth.phpapplication/config/auth.php
	/**
	 * Driver to use for authentication. By default, File and ORM (default) are available.
	 */
	$config['driver'] = 'ORM';	
	$config['hash_method'] = 'sha1';	
	$config['salt_pattern'] = '1, 3, 5, 9, 14, 15, 20, 21, 28, 30';  // this should always be changed	
	$config['lifetime'] = 1209600;
	$config['session_key'] = 'auth_user';
	$config['users'] = array( 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02',);
  • 为了安全起见,建议复制 system/config/cookie.phpsystem/config/session.phpapplication/config 目录下面并修改相应的值。更多信息请参阅部署 Kohana 到产品

驱动

$config['driver'] 来为 auth 扩展设置驱动。目前 Kohana 支持两种驱动:

  • File - 用户凭据存储在 auth 扩展的配置文件中。
  • ORM - 用户和权限均存储在数据库中(默认情况下)。所有操作均通过ORM 库完成。这里有一个使用 auth 扩展使用 ORM 驱动的数据库设计实例:数据库设计:MySQL

Hash 方法

$config['hash_method'] 设置为密码哈希的类型(例如:sha1,md5)。任何所支持的哈希函数可以用在这里。注意的密码长度是由散列类型和数目盐字符的定义。默认使用是 sha1

Salt pattern(盐模)

$config['salt_pattern'] 定义哈希插入 salt 的位移。密码哈希长度将会通过位移总数量而增加。这是实时改变的

生命周期

$config['lifetime'] 设置自动登录(记住我)的 Cookie 生命周期(秒)。默认为两周。

  • 为了安全起见,建议复制 system/config/cookie.phpsystem/config/session.phpapplication/config 目录下面并修改相应的值。更多信息请参阅部署 Kohana 到产品

会话密钥

$config['session_key'] 设置会话密钥(session key)主要用来存放当前用户。他可以存在多个 Auth 实例化。

静态用户

$config['users'] 只有在使用 File 驱动时可用。它包含用户名(键)和哈希密码(值)。

方法

auto_login()

auto_login() 如果用户第一次登陆时勾选 $remember 时,用户尝试自动登录。

login()

login($username, $password, $remember = FALSE) 校验用户名身份并登录。其参数:

  • [string] $username 登录的用户名
  • [string] $password 用户名密码
  • boolean $remember 是否自动登录(默认为 FALSE)。如果设置为 true 则会保存用户的登录信息以方便用户自动登录(即再次归来时使用 auto_login() 判断)。默认自动登录 Cookie 的时间为两周。你可以在 Auth 配置文件中重新修改。

force_login()

force_login($username) 仅输入用户名不输入密码来进行强行登陆。

get_user())

get_user() 返回当前已经登录的用户,否则返回 FALSE。

logout()

logout($destroy = FALSE) 登出用户并注销用户相关 Session 信息。

  • [boolean] $destroy 如果设置为 true 则会删除 Session。反之则不会被删除,但只从 Seesion 删除用户的验证信息。(定义 FALSE)

logged_in()

logged_in($role = NULL) 检查 session 是否存在。 或允许检查指定权限。

  • [string|array] $role 一个权限或者数组形式的权限去检查用户验证(默认为 NULL)

hash_password()

hash_password($password, $salt = FALSE ) 从明码用哈希密码,再从配置的 salt pattern 中插入 salt。

  • [string] $password 明文密码
  • * [string] $salt 哈希密码字符串
  • * 注意:哈希方式来自配置中的 “hash_method”,当创建一个实例化 Auth 扩展是定义在 $configs 数组中。

hash()

hash($str) 哈希字符串,可以在 Auth 配置文件设置哈希方法(例如:sha1,md5)。

find_salt()

find_salt($password) 从密码中寻找 salt,也是基于配置文件的 salt pattern(盐模)。在其他登录的方式下需要自己做密码检查。

范例

基本使用

开始使用 Auth 扩展之前你需要创建 usersrolesroles_users 表且在 users 表中最少要包含:username,password,logins,last_login 字段(你也可以添加其他字段)。实例:创建用户并登录:

$user = ORM::factory('user');
// 把表单的字段赋值给 $user 的属性
foreach ($_POST as $key => $val){
    $user->$key = $val; 
}
if ($user->add(ORM::factory('role', 'login')) AND $user->save()) {
    // 登录方法:login($username,$password)
    Auth::instance()->login($_POST['username'], $_POST['password']); 
 
    // 跳转到其他页面       
    url::redirect('user/profile');
}

守护控制器

为了确保某些控制器可以通过适当的用户,您可以参考下面代码:

function __construct(){
    parent::__construct();
    $this->session= Session::instance();
    $authentic=new Auth;
	if (!$authentic->logged_in()){
	    $this->session->set("requested_url","/".url::current()); // 这回从登录页面跳转到这页面:
	    url::redirect('/user/login');
        }else{
	    $this->user=$authentic->get_user(); // 现在你可以获取用户的数据信息了
	}
}

如果你只是想让指定权限(管理员)的用户去登录访问,你需要更改 'if (!$authentic→logged_in()){' 为 if (!$authentic→logged_in(“admin”)){

用户管理

管理用户可以说是一个痛苦的事情因为它涉及到建立各种表单(用户登录/创建/编辑)和编写显示用户和分配权限的代码。对于大型的应用程序这是一个重要组成部分,但是每个人都有不同的需求,下面是一些基本的例子:

如果你要创建表单,用户名的字段要和在数据库的用户名字段一样。

用户登录,如果用户使用适当的权限去登录并跳转到一个页面并存储 session。如果用户没有权限登录则会跳转当一个解释页面。

如果用户没有登录成功则会跳转到登录页面。

如果登录页面被调用传递数据是 POST 方法并通过这个函数校验并用户登录成功则会再次跳转到这个函数,但是如果用户已经登录进来并跳转到这个页面会储存 session 变量。当用户重新登录会重写它。

/*
 登录主函数,如果有适当权限返回到这页面
*/
public function login($role="")
{
	if (Auth::instance()->logged_in($role))
        {
 	     url::redirect($this->session->get("requested_url")); // 当 login 被调用条到这个页面
	}
	else
	{
             if (Auth::instance()->logged_in()){
                 this->template->title="No Access";
                    $this->template->content=new View('user/noaccess');
	     }else{
                 $this->template->title="Please Login";
                 $this->template->content= new View('user/login');
             }
	}
 
	$form = $_POST;
	if($form)
	{
             // 加载用户
             $user = ORM::factory('user', $form['username']);
             // orm 用户对象或 $form['username'] 可以使用
             Auth::instance()->login($user, $form['password']))
             url::redirect('/user/login');
 	}
}

ORM 驱动的数据库

Mysql

CREATE TABLE IF NOT EXISTS `roles` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
INSERT INTO `roles` (`id`, `name`, `description`) VALUES(1, 'login', 'Login privileges, granted after account confirmation');
INSERT INTO `roles` (`id`, `name`, `description`) VALUES(2, 'admin', 'Administrative user, has access to everything.');
 
CREATE TABLE IF NOT EXISTS `roles_users` (
  `user_id` int(10) UNSIGNED NOT NULL,
  `role_id` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY  (`user_id`,`role_id`),
  KEY `fk_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `email` varchar(127) NOT NULL,
  `username` varchar(32) NOT NULL DEFAULT '',
  `password` char(50) NOT NULL,
  `logins` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `last_login` int(10) UNSIGNED,
   PRIMARY KEY  (`id`),
   UNIQUE KEY `uniq_username` (`username`),
   UNIQUE KEY `uniq_email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `user_tokens` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` int(11) UNSIGNED NOT NULL,
  `user_agent` varchar(40) NOT NULL,
  `token` varchar(32) NOT NULL,
  `created` int(10) UNSIGNED NOT NULL,
  `expires` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `uniq_token` (`token`),
  KEY `fk_user_id` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
ALTER TABLE `roles_users`
  ADD CONSTRAINT `roles_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `roles_users_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE;
 
ALTER TABLE `user_tokens`
  ADD CONSTRAINT `user_tokens_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE;
addons/auth.txt · 最后更改: 2009/02/05 01:42 由 lwkyy