密码保护整个CodeIgniter站点

时间:2014-02-23 18:19:54

标签: php codeigniter

我想用密码保护整个CodeIgniter站点,但不能用HTTP基本身份验证(Apache中的.htaccess,我还是使用Nginx)。

我想要的是一个CodeIgniter驱动的登录页面,可以访问整个站点。如果用户已登录,则仍然使用CodeIgniter路由引擎,因为如果我没有此登录页面,则会使用它。

如果用户没有登录,我可以在每个重定向到登录页面的控制器的开头放置逻辑,但这很容易出错,因为这是一个很多开发人员正在处理的大型项目。如果由于某种原因缺少此逻辑,则匿名用户可以访问应用程序的某些部分。

我认为我想要的是在路由之前执行的操作,它会检查用户是否已登录。有没有一种标准的方法来挂钩代码?

3 个答案:

答案 0 :(得分:1)

在基于codeigniter构建的大型项目中,我会考虑使用通过CI挂钩触发的AOP类来处理安全性(以及其他交叉问题,例如日志记录)。开源AOP库很少,或者你可以编写自己的轻量级解决方案。

A very basic explanation of what AOP is and how it could be done in CI you can read here

答案 1 :(得分:0)

这是我的代码的一部分。它对我很有用:))

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

class Inside扩展了CI_Controller {

private $secured = array('index', 'stats', 'completed', 'calculator', 'howitworks', 'inprogress');
public $data;

public function __construct()
{
    parent::__construct();
    // Loading library, helpers and models.
    $this->load->library(array('form_validation','session'));
    $this->load->helper(array('form', 'url'));
    $this->load->model(array('world_trade', 'user_model', 'calculate', 'core_operations'));

    if(in_array($this->uri->rsegment(2), $this->secured))
    {
        if(!$this->user_model->is_login())
        {
            show_404();
        }
    }

用户模型:

    public function is_login()
{
    if($this->session->userdata('user_id'))
    {
        return true;
    }
    else
    {
        return false;
    }
}

答案 2 :(得分:0)

我选择基于此博客文章中描述的身份验证技术实施解决方案:

http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth

如果博客文章不再存在:它的要点是为您希望在网站上拥有的每个访问组扩展CI_Controller。然后,您可以从这些扩展控制器。扩展CI_Controller的构造函数包含用于检查用户是否已登录和/或属于特定组的代码。

另外,我编写了一个“预控制器”钩子,它检查以确保要执行的Controller是这些扩展控制器之一而不是vanilla CI_Controller。这是在我的应用程序中仅将这些“经过身份验证的控制器”列入白名单。

这可以确保没有加入项目的开发人员使用普通的“CI_Controller”意外打开部分网站。