Библиотека User.php
Рубрика: Статьи -> СПО
Метки: open source | СПО
Просмотров: 2791
Подписаться на комментарии по RSS
Простейшая, на мой взгляд, библиотека для работы с пользователями, под CodeIgniter, разработанная с использованием исходников от DokuWiki. Вообще из этой вики можно почерпнуть много полезного, она активно развивается, несмотря на то что не использует баз данных, а может именно по этому. Обладает большим количеством плагинов и легка в ноастройке, установке и поразительно легко переносится с места на место. Вести локальную базу знаний и документации в ней - одно удовольствие.
<?php /** * Authentication backend * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Andreas Gohr <andi@splitbrain.org> * @author Chris Smith <chris@jalakai.co.uk> * @author Serge Telicyn <dizatorr@gmail.com> (http://unicorn.e-nk.ru) */ if (!defined('BASEPATH')) exit('Нет доступа к скрипту'); class User { var $CI; var $user_table = 'users'; //Таблица пользователей var $default_group = array ('user'); var $cript_metod = 'sha1'; var $users = null; var $USERINFO = null; var $error_info = null; function User() { $this->__constructor(); } function __constructor() { $this->CI =& get_instance(); //$this->CI-> if (!$this->CI->db->table_exists($this->user_table)) { $this->error_info = 'Таблица '.$this->user_table.' не найдена' ; //Create Table можно вынести в инсталятор $this->CI->load->dbforge(); $fields = array( 'pass' => array('type' => 'TEXT'), 'user' => array('type' => 'varchar','constraint' => '100'), // Login 'realname' => array('type' => 'TEXT'), 'mail' => array('type' => 'varchar','constraint' => '100'), 'grps' => array('type' => 'TEXT'), 'blocked' => array('type' =>'INT', 'constraint' => '1', 'default' => '0' ) ); $this->CI->dbforge->add_field('id'); $this->CI->dbforge->add_field($fields); if (!$this->CI->dbforge->create_table($this->user_table)) { $this->error_info .= ' Попытка создания таблицы не удалась'; } } $this->_loadUserData(); // А надо ли? $this->error_info = 'Модуль авторизации удачно загружен'; } function login($user = '', $pass = '') { $this->CI->load->library('session'); if (!$this->CI->session->userdata('user')) { if(!empty($user) OR !empty($pass)) { if ($this->checkPass($user,$pass)) { $cessionData['user'] = $this->info($user); $this->CI->session->set_userdata($cessionData); $this->error_info = 'Пользователь удачно вошел в систему'; return true; } $this->error_info = 'Пользователь не неайден'; return false; } $this->error_info = 'Неверно введены данные'; return false; } $this->error_info = 'Пользователь уже вошел в систему'; return false; } function error() { return $this->error_info; } function logout() { $this->CI->load->library('session'); $this->CI->session->unset_userdata('user'); } function auth_browseruid() { $uid = ''; $uid .= $_SERVER['HTTP_USER_AGENT']; $uid .= $_SERVER['HTTP_ACCEPT_ENCODING']; $uid .= $_SERVER['HTTP_ACCEPT_LANGUAGE']; $uid .= $_SERVER['HTTP_ACCEPT_CHARSET']; $uid .= substr($_SERVER['REMOTE_ADDR'],0,strpos($_SERVER['REMOTE_ADDR'],'.')); return md5($uid); } function create($user,$pass,$mail,$realname = '',$grps=null) { $blocked = 0; // user mustn't already exist if ($this->info($user) !== false) return false; $pass = $this->auth_cryptPassword($pass); // set default group if no groups specified if (!is_array($grps)) $grps = $this->default_group; // prepare user line $groups = join(',',$grps); $data = array( 'user' => $user, 'realname' => $realname, 'pass' => $pass, 'mail'=>$mail, 'grps'=>$groups, 'blocked' => $blocked ); $this->CI->db->set($data); if(!$this->CI->db->insert($this->user_table)) { //There was a problem! return false; } $this->users[$user] = compact('user', 'pass','realname','mail','grps', 'blocked'); return $pass; } /** * Remove one or more users from the list of registered users * * @author Christopher Smith <chris@jalakai.co.uk> * @param array $users array of users to be deleted * @return int the number of users deleted */ function delete($users) { if (!is_array($users) || empty($users)) return 0; if ($this->users === null) $this->_loadUserData(); $deleted = array(); foreach ($users as $user) { if (isset($this->users[$user])) $deleted[] = $user; } if (empty($deleted)) return 0; $this->CI->db->where_in('user', $deleted); if ($this->CI->db->delete($this->user_table)) { foreach ($deleted as $user) unset($this->users[$user]); return count($deleted); } return 0; } function blokc ($users) { if (empty($users)) return 0; if (is_array($users)) { foreach ($users as $key=>$user) { if ($key === 0) { $this->CI->db->where('user =', $user); }else { $this->CI->db->or_where('user =', $user); } } } else $this->CI->db->where('user =', $users); $data = array ('blocked' => 1); $this->CI->db->update($this->user_table, $data); } function checkPass($user,$pass) { $userinfo = $this->info($user); if ($userinfo === false) return false; return $this->auth_verifyPassword($pass,$this->users[$user]['pass']); } function info($user) { if($this->users === null) $this->_loadUserData(); return isset($this->users[$user]) ? $this->users[$user] : false; } function auth_cryptPassword($clear, $salt='', $method = FALSE) { if (!$method) $method = $this->cript_metod; //prepare a salt if(empty($salt)) $salt = md5(uniqid(rand(), true)); switch(strtolower($method)) { case 'smd5': return crypt($clear,'$1$'.substr($salt,0,8).'$'); case 'md5': return md5($clear); case 'sha1': return sha1($clear); case 'ssha': $salt=substr($salt,0,4); return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt); case 'crypt': return crypt($clear,substr($salt,0,2)); case 'mysql': //from http://www.php.net/mysql comment by <soren at byu dot edu> $nr=0x50305735; $nr2=0x12345671; $add=7; $charArr = preg_split("//", $clear); foreach ($charArr as $char) { if (($char == '') || ($char == ' ') || ($char == '\t')) continue; $charVal = ord($char); $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8); $nr2 += ($nr2 << 8) ^ $nr; $add += $charVal; } return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff)); case 'my411': return '*'.sha1(pack("H*", sha1($clear))); default: $this->error_info = "Неизвесный метод шифрования $method"; return FALSE; } } function auth_verifyPassword($clear,$crypt) { $method=$this->cript_metod; $salt=''; //determine the used method and salt $len = strlen($crypt); if(substr($crypt,0,3) == '$1$') { $method = 'smd5'; $salt = substr($crypt,3,8); }elseif(substr($crypt,0,6) == '{SSHA}') { $method = 'ssha'; $salt = substr(base64_decode(substr($crypt, 6)),20); }elseif($len == 32) { $method = 'md5'; }elseif($len == 40) { $method = 'sha1'; }elseif($len == 16) { $method = 'mysql'; }elseif($len == 41 && $crypt[0] == '*') { $method = 'my411'; }else { $method = 'crypt'; $salt = substr($crypt,0,2); } //crypt and compare if($this->auth_cryptPassword($clear, $salt, $method) === $crypt) { return true; } return false; } function _loadUserData() { //$this->CI =& get_instance(); $this->users = array(); $query = $this->CI->db->get($this->user_table); $table = $query->result_array(); //print_r($table); foreach($table as $line) { $this->users[$line['user']]['user'] = urldecode($line['user']); $this->users[$line['user']]['pass'] = $line['pass']; $this->users[$line['user']]['mail'] = $line['mail']; $this->users[$line['user']]['realname'] = $line['realname']; $this->users[$line['user']]['grps'] = split(",",$line['grps']); $this->users[$line['user']]['blocked'] = $line['blocked']; } //print_r($this->users); } } ?>

Оставьте комментарий!