如何防止codeigniter中的某个特定视图不能通过url直接访问?

时间:2014-09-16 16:13:43

标签: php codeigniter

在视图中我有两个文件夹页面,模板。在内页我有两个文件夹非成员和成员。 在模板里面我有header.php和footer.php。 在nonmember文件夹中,我有一个通知文件,email_notification.php,以及其他文件 home.php,about.php等。

使用以下函数

动态生成

页面

public function index(){
    $this->nonmember();
  }

public function nonmember($page = 'home'){ 

   if (! file_exists(APPPATH.'views/pages/nonmember/'.$page.'.php')) {
    show_404();
   }

   $data['title'] = ucfirst($page);

   $this->load->view('templates/header', $data);
   $this->load->view('pages/nonmember/'.$page, $data);
   $this->load->view('templates/footer', $data);

  }

并将其调用以显示登录页面或注册页面

public function registration(){
//validation rules

   if($this->form_validation->run()){
    //add user to a temporary table
    //send an email with an activation code
    $this->nonmember('email_notification'); 
   //that view says click the link in email for activating account
     }else{
    $this->nonmember('registration');
    }
}

问题是email_notification视图也可以通过url访问,这是不可取的。 如何阻止email_notification直接访问?就像用户尝试使用url访问它一样 我想将它们重定向回主页,或者show_error()?

3 个答案:

答案 0 :(得分:0)

阻止导航到视图文件,即http://[application_root]/application/views/pages/nonmember/email_notification.php

您可以在CodeIgniter文件的开头使用以下代码段:

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

相反,如果您试图阻止对显示此页面的控制器操作进行Web访问,则可以使用CLI实用程序:Codeigniter 2 restrict controller to command line

答案 1 :(得分:0)

只需将其作为私人&#34;方法。您可以使用关键字private(类似于在方法之前将单词设置为public) - 而codeigniter允许您在方法名称之前仅使用下划线创建私有方法

    function index(){

       $this->_nonmember();

      }

    function _nonmember($page = 'home'){

  … etc etc

许多优点 - 私有方法名称未公开,您可以在以后需要时更改方法名称

function index(){

   $this->_someNewNonMemberMethod();

  }

但对于用户来说却完全一样。

========编辑

以及许多不同的解决方案以及您希望如何设计应用程序。像一个考虑因素是为成员和非成员分别设置控制器。但是对于您发布的代码,您已经有了一个单独的注册方法,所以最快的方法是为电子邮件视图创建一个快速私有方法,如果您不希望这样做。

public function registration(){
//validation rules

   if($this->form_validation->run()){
    //add user to a temporary table
    //send an email with an activation code

    // make this method private
    $this->_nonmemberEmailNotify() ; 

答案 2 :(得分:0)

正如James Lalor已经提到过使用会话这是一个很好的解决方案。 我所做的就是$this->nonmember('email_notification');我正在使用

创建会话之前
$this->session->set_userdata('email_notification' => 1);

在非成员函数中,我只是检查该会话是否设置为1。

if ($page == 'email_notification' && $this->session->userdata('email_notification') != 1) {
     redirect($this->agent->referrer());
   }

稍后当用户激活他们的帐户时,我会破坏会话