Hi guys,

well, I wrote a class for a big project (a framework), and here it is, I was wondering if someone have any suggestions regarding flexibility and security.

Course it uses specific framework classes but it's quite understable..

==================================================================
<?php
/**
* Project: BBBM Framework
* File: authentication.class.php
*
* @desc Main Authentication Class
* @link http://www.bbbm.com.br/
* @copyright 2004 Bruno B B Magalhaes
* @author Bruno B B Magalhaes <[EMAIL PROTECTED]>
* @package BBBM Framework
* @version 0.5dev
*/
class authentication
{
        var $domain;
        
        var $database;
        
        var $authenticated = false;
        
        var $access_section = '';
        var $access_level = '0';
        
        var $post;
        var $session;
        var $cookie;

var $userid;
var $username;
var $password;
var $sessionid;
var $remember_me;

var $errormsg;

var $tables = array('users','usersgroups');

/**
* PHP 4 Constructor
*/
function authentication(&$database)
{
$this->database =& $database;
$this->database->build_table($this->tables);
$this->domain = $_SERVER['HTTP_HOST'];
}

/**
* Start Authentication Process
*/
function authenticate($access_section='',$access_level=0)
{
if($access_level > 0)
{
$this->access_level = $access_level;
$this->access_section = $access_section;

$this->check_post();
$this->check_session();
$this->check_cookie();

if($this->post == true)
{
$this->auth($this->username,$this->password,$this->access_level);
}
elseif($this->cookie == true)
{
$this->auth_check($this->username,$this->sessionid,$this- >access_level);
}
elseif($this->session == true)
{
$this->auth_check($this->username,$this->sessionid,$this- >access_level);
}
else
{
$this->authenticated = false;
}
}
else
{
$this->authenticated = true;
}
}


        /**
        * Authentication Process
        */
        function auth($username='',$password='',$accesslevel=0)
        {
                $query = 'SELECT
                                *
                            FROM
                                '.$this->database->table['users'].' AS users,
                                '.$this->database->table['usersgroups'].' AS 
groups
                            WHERE
                                users.userGroup=groups.groupId
                            AND
                                users.userName=\''.$username.'\'
                            AND
                                users.userPassword=\''.$password.'\'
                            AND
                                users.userStatus > \'0\'
                            AND
                                groups.groupStatus > \'0\'
                            LIMIT
                                1';

$this->database->query($query);

if($this->database->num_rows() > 0)
{
$this->database->fetch_array();

if($this->database->row['groupLevel'] >= $accesslevel)
{
$this->authenticated = true;

$this->userid = $this->database->row['userId'];
$this->session_write('username',$this->database->row['userName']);
$this->session_write('userlevel',$this->database- >row['groupLevel']);

if(isset($this->remember_me))
{
$this->cookie_write('username',$this->database->row['userName']);
$this->cookie_write('sessionid',session_id());
}

$update_query = 'UPDATE
'.$this->database->table['users'].'
SET
userSession=\''.session_id().'\',
userLastvisit = NOW()
WHERE
userId=\''.$this->database->row['userId'].'\'';


                                $this->database->query($update_query);
                        }
                        else
                        {
                                $this->logout();
                                $this->authenticated = false;
                                $this->errormsg = 'error_noaccessprivileges';
                        }

                }
                else
                {
                        $this->logout();
                        $this->authenticated = false;
                        $this->errormsg = 'error_unauthorized';
                }
        }

        /**
        * Authentication Check Process
        */
        function auth_check($username='',$sessionid='',$accesslevel=0)
        {
                $query = 'SELECT
                                users.userId,
                                groups.groupLevel
                            FROM
                                '.$this->database->table['users'].' AS users,
                                '.$this->database->table['usersgroups'].' AS 
groups
                            WHERE
                                users.userGroup=groups.groupId
                            AND
                                users.userName=\''.$username.'\'
                            AND
                                users.userSession=\''.$sessionid.'\'
                            AND
                                users.userStatus > \'0\'
                            AND
                                groups.groupStatus > \'0\'
                            LIMIT
                                1';

$this->database->query($query);

if($this->database->num_rows() > 0)
{
$this->database->fetch_array();
if($this->database->row['groupLevel'] >= $accesslevel)
{
$this->authenticated = true;

$this->userid = $this->database->row['userId'];

$this->session_write('userlevel',$this->database- >row['groupLevel']);

if(isset($this->remember_me))
{
$this->cookie_write('username',$this->database->row['userName']);
$this->cookie_write('sessionid',session_id());
}

$update_query = 'UPDATE
'.$this->database->table['users'].'
SET
userSession=\''.$sessionid.'\'
userLastvisit = NOW()
WHERE
userId=\''.$this->database->row['userId'].'\'';

$this->database->query($update_query);
}
else
{
$this->logout();
$this->authenticated = false;
$this->errormsg = 'error_noaccessprivileges';
}


                }
                else
                {
                        $this->logout();
                        $this->authenticated = false;
                        $this->errormsg = 'error_unauthorized';
                }
        }
        
        /**
        * Logout Process
        */
        function logout()
        {
                if(isset($this->session) || isset($this->cookie))
                {
                        $update_query = 'UPDATE
                                                
'.$this->database->table['users'].'
                                             SET
                                                userSession=\'\'
                                             WHERE
                                                userName=\''.$this->username.'\'
                                             AND
                                                
userSession\''.$this->sessionid.'\'
                                             ';
                        
                        $this->database->query($update_query);
                
                        if(isset($this->session))
                        {
                                session_unset();
                                session_destroy();
                        }
                        
                        if(isset($this->cookie))
                        {
                                setcookie('username','',time() - 
3600,'/',$this->domain);
                                setcookie('sessionid','',time() - 
3600,'/',$this->domain);
                        }
                }
        }
        
        /**
        * Session Write Function
        */
        function session_write($var='',$val='')
        {
                $_SESSION[$var] = $val;
        }
        
        /**
        * Cookie Write Function
        */
        function cookie_write($var='',$val='')
        {
                setcookie($var,$val,time()+24*3600*7,'/',$this->domain);
        }
        
        /**
        * Session Check Function
        */
        function check_session()
        {
                if(isset($_SESSION))
                {
                        $this->sessionid = session_id();
                        if(isset($_SESSION['username']) & 
isset($this->sessionid))
                        {
                                if($_SESSION['username'] !='' & 
$this->sessionid !='')
                                {
                                        $this->session = true;
                                        $this->username = 
addslashes(strip_tags($_SESSION['username']));
                                        $this->remember_me =  false;
                                }
                                else
                                {
                                        $this->session = false;
                                        $this->errormsg = 'error_sessionerror';
                                }
                        }
                        else
                        {
                                $this->session = false;
                        }
                }
                else
                {
                        $this->session= false;
                }
        }
        
        /**
        * Cookie Check Function
        */
        function check_cookie()
        {
                if(isset($_COOKIE))
                {
                        if(isset($_COOKIE['username']) & 
isset($_COOKIE['sessionid']))
                        {
                                if($_COOKIE['username'] !='' & 
$_COOKIE['sessionid'] !='')
                                {
                                        $this->cookie= true;
                                        $this->username = 
addslashes(strip_tags($_COOKIE['username']));
                                        $this->sessionid = 
addslashes(strip_tags($_COOKIE['sessionid']));
                                        $this->remember_me =  true;
                                }
                                else
                                {
                                        $this->cookie= false;
                                        $this->errormsg = 'error_cookieerror';
                                }
                        }
                        else
                        {
                                $this->cookie = false;
                        }
                }
                else
                {
                        $this->cookie = false;
                }
        }
        
        /**
        * Cookie Check Post
        */
        function check_post()
        {
                if(isset($_POST))
                {
                        if(isset($_POST['username']) & 
isset($_POST['password']))
                        {
                                if($_POST['username'] !='' & $_POST['password'] 
!='')
                                {
                                        $this->post = true;
                                        $this->username = 
addslashes(strip_tags($_POST['username']));
                                        $this->password = 
md5($_POST['password']);
                                        if(isset($_POST['rememberme']))
                                        {
                                                $this->remember_me =  true;
                                        }
                                        else
                                        {
                                                $this->remember_me =  false;
                                        }
                                }
                                else
                                {
                                        $this->post = false;
                                        $this->errormsg = 'error_unfilledfield';
                                }
                        }
                        else
                        {
                                $this->post = false;
                        }
                }
                else
                {
                        $this->post = false;
                }
        }
}
?>
============================================================

Best Regards,
Bruno B B Magalhaes

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to