| 状态 | Stub |
|---|---|
| Todo | Define what is a login 'role' or make a link to related doc |
| Todo | make better examples |
| 官方最后更新时间 | 2009/02/02 09:52 |
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.php 到 application/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.php 和 system/config/session.php 到 application/config 目录下面并修改相应的值。更多信息请参阅部署 Kohana 到产品。
$config['driver'] 来为 auth 扩展设置驱动。目前 Kohana 支持两种驱动:
$config['hash_method'] 设置为密码哈希的类型(例如:sha1,md5)。任何所支持的哈希函数可以用在这里。注意的密码长度是由散列类型和数目盐字符的定义。默认使用是 sha1。
$config['salt_pattern'] 定义哈希插入 salt 的位移。密码哈希长度将会通过位移总数量而增加。这是实时改变的。
$config['lifetime'] 设置自动登录(记住我)的 Cookie 生命周期(秒)。默认为两周。
system/config/cookie.php 和 system/config/session.php 到 application/config 目录下面并修改相应的值。更多信息请参阅部署 Kohana 到产品。
$config['session_key'] 设置会话密钥(session key)主要用来存放当前用户。他可以存在多个 Auth 实例化。
$config['users'] 只有在使用 File 驱动时可用。它包含用户名(键)和哈希密码(值)。
auto_login() 如果用户第一次登陆时勾选 $remember 时,用户尝试自动登录。
login($username, $password, $remember = FALSE) 校验用户名身份并登录。其参数:
$username 登录的用户名$password 用户名密码 $remember 是否自动登录(默认为 FALSE)。如果设置为 true 则会保存用户的登录信息以方便用户自动登录(即再次归来时使用 auto_login() 判断)。默认自动登录 Cookie 的时间为两周。你可以在 Auth 配置文件中重新修改。
force_login($username) 仅输入用户名不输入密码来进行强行登陆。
get_user() 返回当前已经登录的用户,否则返回 FALSE。
logout($destroy = FALSE) 登出用户并注销用户相关 Session 信息。
$destroy 如果设置为 true 则会删除 Session。反之则不会被删除,但只从 Seesion 删除用户的验证信息。(定义 FALSE)
logged_in($role = NULL) 检查 session 是否存在。 或允许检查指定权限。
$role 一个权限或者数组形式的权限去检查用户验证(默认为 NULL)
hash_password($password, $salt = FALSE ) 从明码用哈希密码,再从配置的 salt pattern 中插入 salt。
$password 明文密码 $salt 哈希密码字符串
hash($str) 哈希字符串,可以在 Auth 配置文件设置哈希方法(例如:sha1,md5)。
find_salt($password) 从密码中寻找 salt,也是基于配置文件的 salt pattern(盐模)。在其他登录的方式下需要自己做密码检查。
开始使用 Auth 扩展之前你需要创建 users,roles,roles_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'); } }
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;