Skip to content
Derek Jones edited this page Jul 5, 2012 · 3 revisions

Overview

I was needing something to use for keeping parts of my website away from the general public. So this is what I came up with and decided to give it back to an awesome community. This is a hook to authenticate and authorize people do make use of specific controllers/methods.

Here are the files that need to be changed or created.

1.) Configs

/system/application/config/config.php

Set your encryption key & enable session encryption. I also suggest enabling the store sessions in database.

/system/application/config/hooks.php

[pre] <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$hook['post_controller_constructor'] = array( 'class' => 'Ignitionkeys', 'function' => 'index', 'filename' => 'Ignitionkeys.php', 'filepath' => 'hooks' );

/* End of file hooks.php / / Location: ./system/application/config/hooks.php */ [/pre]

2.) Hooks

Here is the class that does all the work.

/system/application/hooks/Ignitionkeys.php

[pre] <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Ignitionkeys {

var $CI;
var $lang;

function Ignitionkeys() {        
    $this->CI =& get_instance();
    
    if ( ! in_array('ignitionkeys_lang'.EXT, $this->CI->lang->is_loaded, TRUE))
    {
        $this->CI->lang->load('ignitionkeys');
    }
    
    if (!isset($this->CI->session)) {
        $this->CI->load->library('session');
    }
    
    $this->CI->load->model('ignitionkeys_users', 'users');    
    $this->CI->load->helper('form');
    $this->CI->load->helper('url');
    
    log_message('debug', "Ignitionkeys Class Initialized");
}

function index() {
    
    if ($this->CI->input->post('login')) {
        $this->loginUser();
    }
    
    if ($this->CI->input->post('logout')) {
        $this->logoutUser();
    }
    
    if (!isset($this->CI->keyLevel))
        return;
    
    if (is_array($this->CI->keyLevel)) {
        if (isset($this->CI->keyLevel[$this->CI->uri->rsegment(2)])) {
            $keyLevel = $this->CI->keyLevel[$this->CI->uri->rsegment(2)];
        } else {
            $keyLevel = 0;
        }
    } elseif (is_int($this->CI->keyLevel)) {
        $keyLevel = $this->CI->keyLevel;
    } else {
        $keyLevel = 0;
    }
    
    if ($keyLevel == 0)
        return;
        
    if ($this->CI->session->userdata('keyLevel')) {
        if ($this->CI->session->userdata('keyLevel') < $keyLevel) {
            $this->showLogin('error_notauthorized');
        }  
    } else {
        $this->showLogin('error_loginrequired');
    }
}

function loginUser() {
    if ($user = $this->CI->users->get($this->CI->input->post('username'))) {
        if ($user['password'] == $this->CI->input->post('password')) {
            $this->CI->session->set_userdata('keyLevel', $user['keyLevel']);
            $this->CI->session->set_userdata('username', 
                           $this->CI->input->post('username'));
            return;
        } 
    }
    $this->showLogin('error_baduserpass');
}

function logoutUser() {
    $this->session->sess_destroy();
    redirect();
}

function showLogin($errorKey='default') {
    $this->CI->load->view('ignitionkeys_login', 
                   array('error' => $this->CI->lang->line($errorKey)));
    echo $this->CI->output->get_output();
    exit();
}

} [/pre]

3.) Controllers

As you can see this is the default controller that comes with the framework. In order to create a controller that requires authentication you simply add the class variable $keyLevel and set it inside your construct to the level you wish to have.

/system/application/controllers/welcome.php

[pre] <?php

class Welcome extends Controller {

var $keyLevel;

function Welcome()
{
    parent::Controller();
    
    $this->keyLevel = array('index ' => 5);
}

function index()
{
    $this->load->view('welcome_message');
}

}

/* End of file welcome.php / / Location: ./system/application/controllers/welcome.php */ [/pre]

4.) Languages

The language file has just three entries as I didn't need any more then that. I thought of keeping it in the code... but I just know someone would say something about putting it in a language file... so I beat you to the punch!

/system/application/language/english/ignitionkeys_lang.php

[pre] <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); $lang['error_baduserpass'] = "That Username or Password is incorrect."; $lang['error_notauthorized'] = "You are not authorized to perform this action."; $lang['error_loginrequired'] = "Login Required"; [/pre]

5.) Models

[quote]As I am making use of levels, rather then individual ACLs I simply place them in an array. If you have a need to track what a user is doing, you can make a change to the model class to pull the information from a database, so that you have the username of each user. Along with other information you may wish. This feature just wasn't needed by my requirements.[/quote]

/system/application/models/ignitionkeys_users.php

[pre] <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Ignitionkeys_users extends Model {

var $keys;

function Ignitionkeys_users() {
    $this->keys['admin']     = array('password' => 'admin', 'keyLevel' => 99);
    $this->keys['mod']         = array('password' => 'mod', 'keyLevel' => 2);
    $this->keys['user']     = array('password' => 'user', 'keyLevel' => 1);
}
    
function get($username) {
    if (isset($this->keys[$username])) {
        return $this->keys[$username];
    } else {
        return FALSE;
    }
}

} [/pre]

6.) Views

This is a VERY simple login form. Take special note of the hidden field. This is how the hook knows that you are trying to submit a login form and not some other form! What is not show here is how to log out. In order to do that you will want to submit a form with just a hidden field that has the name of logout.

/system/application/views/ignitionkeys_logon.php

[pre]

<html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

&lt;title&gt;Ignitionkeys Login&lt;/title&gt;

</head>

<body> <?=$error?>
<?=form_open(site_url())?> Username:<input type="text" name="username" /> </input></label>
Password:<input type="password" name="password" /> </input></label>
<input type="hidden" name="login" value="TRUE" /> <input type="submit" name="submit"> </form>

</body> </html> [/pre]

Clone this wiki locally