我想用密码保护整个CodeIgniter站点,但不能用HTTP基本身份验证(Apache中的.htaccess,我还是使用Nginx)。
我想要的是一个CodeIgniter驱动的登录页面,可以访问整个站点。如果用户已登录,则仍然使用CodeIgniter路由引擎,因为如果我没有此登录页面,则会使用它。
如果用户没有登录,我可以在每个重定向到登录页面的控制器的开头放置逻辑,但这很容易出错,因为这是一个很多开发人员正在处理的大型项目。如果由于某种原因缺少此逻辑,则匿名用户可以访问应用程序的某些部分。
我认为我想要的是在路由之前执行的操作,它会检查用户是否已登录。有没有一种标准的方法来挂钩代码?
答案 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”意外打开部分网站。