Вход Регистрация
Файл: chatigniter v2/application/modules/chat/libraries/Authentication.php
Строк: 360
<?php defined('BASEPATH') OR exit('No direct script access allowed');


/**
 * Authentication Class
 *
 * Very basic user authentication for CodeIgniter.
 * 
 * @package        Authentication
 * @version        1.0
 * @author        Joel Vardy <info@joelvardy.com>
 * @link        https://github.com/joelvardy/Basic-CodeIgniter-Authentication
 */
class Authentication {


    
/**
     * CodeIgniter
     *
     * @access    private
     */
    
private $ci;


    
/**
     * Config items
     *
     * @access    private
     */
    
private $user_table;
    private 
$identifier_field;
    private 
$username_field;
    private 
$password_field;


    
/**
     * Constructor
     */
    
function __construct()
    {

        
// Assign CodeIgniter object to $this->ci
        
$this->ci =& get_instance();

        
// Load config
        
$this->ci->config->load('authentication');
        
$authentication_config $this->ci->config->item('authentication');

        
// Set config items
        
$this->user_table $authentication_config['user_table'];
        
$this->identifier_field $authentication_config['identifier_field'];
        
$this->username_field $authentication_config['username_field'];
        
$this->email_field $authentication_config['email_field'];
        
$this->password_field $authentication_config['password_field'];

        
// Load database
        
$this->ci->load->database();

        
// Load libraries
        
$this->ci->load->library('session');

    }


    
/**
     * Check whether the username is unique
     *
     * @access    public
     * @param    string [$username] The username to query
     * @return    boolean
     */
    
public function username_check($username)
    {

        
// Read users where username matches
        
$query $this->ci->db->where($this->username_field$username)->get($this->user_table);

        
// If there are users
        
if ($query->num_rows() > 0)
        {
            
// Username is not available
            
return FALSE;
        }

        
// No users were found
        
return TRUE;

    }

    public function 
email_check($email)
    {

        
// Read users where email matches
        
$query $this->ci->db->where($this->email_field$email)->get($this->user_table);

        
// If there are users
        
if ($query->num_rows() > 0)
        {
            
// Username is not available
            
return FALSE;
        }

        
// No users were found
        
return TRUE;

    }


    
/**
     * Generate a salt
     *
     * @access    protected
     * @param    integer [$cost] The strength of the resulting hash, must be within the range 04-31
     * @return    string The generated salt
     */
    
public function generate_salt($cost 16)
    {

        
// We are using blowfish, so this must be set at the beginning of the salt
        
$salt '$2a$'.$cost.'$';

        
// Generate a random string based on time
        
$salt .= substr(str_replace('+''.'base64_encode(sha1(microtime(TRUE), TRUE))), 022);

        
// Return salt
        
return $salt.'$';

    }


    
/**
     * Generate a hash
     *
     * @access    protected
     * @param    string [$password] The password for which the hash should be generated for
     * @param    string [$salt] The salt can either be the one returned from the generate_salt method or the current password
     * @return    string The generated hash
     */
    
public function generate_hash($password$salt)
    {

        
// Hash the generated details with a salt to form a secure password hash
        
return crypt($password$salt);

    }


    
/**
     * Create user
     *
     * @access    public
     * @param    string [$username] The username of the user to be created
     * @param    string [$password] The users password
     * @return    integer|boolean Either the user ID or FALSEupon failure
     */
    
public function create_user($username$password)
    {

        
// Ensure username is available
        
if ( ! $this->username_check($username))
        {
            
// Username is not available
            
return FALSE;
        }

        
// Generate salt
        
$salt $this->generate_salt();

        
// Generate hash
        
$password $this->generate_hash($password$salt);

        
// Define data to insert
        
$data = array(
            
$this->username_field => $username,
            
$this->password_field => $password
        
);

        
// If inserting data fails
        
if ( ! $this->ci->db->insert($this->user_table$data))
        {
            
// Return false
            
return FALSE;
        }

        
// Return user ID
        
return (int) $this->ci->db->insert_id();

    }


    
/**
     * Login
     *
     * @access    public
     * @param    string [$username] The username of the user to authenticate
     * @param    string [$password] The password to authenticate
     * @return    boolean Either TRUE or FALSE depending upon successful login
     */
    
public function login($username$password)
    {

        
// Select user details
        
$user $this->ci->db
            
->select($this->identifier_field.' as identifier, '.$this->username_field.' as username, '.$this->password_field.' as password')
            ->
where($this->username_field$username)
            ->
get($this->user_table);

        
// Ensure there is a user with that username
        
if ($user->num_rows() == 0)
        {
            
// There is no user with that username, but we won't tell the user that
            
return FALSE;
        }

        
// Set the user details
        
$user_details $user->row();

        
// Do passwords match
        
if (sha1($password) == $user_details->password)
        {

            
// Yes, the passwords match

            // Set the userdata for the current user
            
$this->ci->session->set_userdata(array(
                
'identifier' => $user_details->identifier,
                
'username' => $user_details->username,
                
'logged_in' => $_SERVER['REQUEST_TIME']
            ));

            return 
TRUE;

        
// The passwords don't match
        
} else {
            
// The passwords don't match, but we won't tell the user that
            
return FALSE;
        }

    }


    
/**
     * Check whether a user is logged in
     *
     * @access    public
     * @return    boolean TRUE for a logged in user otherwise FALSE
     */
    
public function is_loggedin()
    {

        
// Return true or flase based on the presence of user data
        
return (bool) $this->ci->session->userdata('identifier');

    }


    
/**
     * Read user details
     *
     * @access    public
     * @return    mixed or FALSE
     */
    
public function read($key)
    {

        
// Only allow us to read certain data
        
switch ($key)
        {
            case 
'identifier': {

                
// If the user is not logged in return false
                
if ( ! $this->is_loggedin()) return false;

                
// Return user identifier
                
return (int) $this->ci->session->userdata('identifier');

                break;

            }
            case 
'username': {

                
// If the user is not logged in return false
                
if ( ! $this->is_loggedin()) return false;

                
// Return username
                
return (string) $this->ci->session->userdata('username');

                break;

            }
            case 
'login': {

                
// If the user is not logged in return false
                
if ( ! $this->is_loggedin()) return false;

                
// Return time the user logged in at
                
return (int) $this->ci->session->userdata('logged_in');

                break;

            }
            case 
'logout': {

                
// Return time the user logged out at
                
return (int) $this->ci->session->userdata('logged_out');

                break;

            }
        }

        
// If nothing has been returned yet
        
return false;

    }


    
/**
     * Change password
     *
     * @access    public
     * @param    string [$password] The new password
     * @param    string [$user_identifier] The identifier of the user whos password will be changed, if none is set the current users password will be changed
     * @return    boolean Either TRUE or FALSE depending upon successful login
     */
    
public function change_password($password$user_identifier null)
    {

        
// If no user identifier has been set
        
if ( ! $user_identifier)
        {
            
// Ensure the current user is logged in
            
if ($this->is_loggedin())
            {

                
// Read the user identifier
                
$user_identifier $this->ci->session->userdata('identifier');

            
// There is no current logged in user
            
} else {
                return 
FALSE;
            }
        }

        
// Generate salt
        
$salt $this->generate_salt();

        
// Generate hash
        
$password $this->generate_hash($password$salt);

        
// Define data to update
        
$data = array(
            
$this->password_field => $password
        
);

        
// Update the users password
        
if ($this->ci->db->where($this->identifier_field$user_identifier)->update($this->user_table$data))
        {
            return 
TRUE;
        
// There was an error updating the user
        
} else {
            return 
FALSE;
        }

    }


    
/**
     * Log a user out
     *
     * @access    public
     * @return    boolean Will always return TRUE
     */
    
public function logout()
    {

        
// Remove userdata
        
$this->ci->session->unset_userdata('identifier');
        
$this->ci->session->unset_userdata('username');
        
$this->ci->session->unset_userdata('logged_in');

        
// Set logged out userdata
        
$this->ci->session->set_userdata(array(
            
'logged_out' => $_SERVER['REQUEST_TIME']
        ));

        
// Return true
        
return TRUE;

    }


    
/**
     * Delete user account
     *
     * @access    public
     * @param    string [$user_identifier] The identifier of the user to delete
     * @return    boolean Either TRUE or FALSE depending upon successful login
     */
    
public function delete_user($user_identifier)
    {

        
// Update the users password
        
if ($this->ci->db->where($this->identifier_field$user_identifier)->delete($this->user_table))
        {
            return 
TRUE;
        
// There was an error deleting the user
        
} else {
            return 
FALSE;
        }

    }


}

/* End of file Authentication.php */
/* Location: ./application/libraries/Authentication.php */
Онлайн: 1
Реклама