2014-09-16 3 views
0

У меня есть две папки, шаблоны. Внутри страниц у меня есть две папки, не являющиеся членами и членами. Внутри шаблонов у меня есть header.php и footer.php. В папке я не являющейся членом есть файл уведомление, email_notification.php, наряду с другими файлами, как home.php, about.php и т.д.Как я могу запретить доступ к одному конкретному виду в кодеигнитре напрямую через url?

страницы генерируется динамически с помощью следующей функции

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()?

+1

Я рекомендую вам установить переменный сеанс, а затем не загрузят вид, если она не существует. –

+0

Показать 'email_notification'. –

+0

@DwayneTowell email_notification - это только раздел тела, в котором говорится, что электронное письмо было отправлено с ссылкой активации, нажмите на ссылку, чтобы активировать свою учетную запись. Но см. Мой собственный ответ, который я использовал, как рекомендовал Джеймс Латор. – user1906399

ответ

0

Поскольку Джеймс Лэлор уже упомянул об использовании сеанса, который является хорошим решением. Что я сделал это как раз перед $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()); 
    } 

Позже, когда пользователь активировать свою учетную запись я разрушив сеанс

+0

Этот метод означает, что если пользователь закрывает свой браузер до получения электронной почты, он может работать некорректно, поскольку сеанс будет Потерянный. Это зависит от того, как настроены сеансы и файлы cookie. –

+0

Пользователю просто требуется только один раз, чтобы просмотреть страницу email_notification. После того, как они нажмут кнопку регистрации, они перенаправляются на нее. поэтому они могут закрыть браузер только после нажатия кнопки отправки. Если они остаются на сайте и активируют учетную запись и все еще хотят попытаться получить доступ к этой странице электронной почты, они не могут заставить я уничтожить сессию, как только они нажмут на ссылку активации. Основная проблема заключалась в прямом доступе email_notification через url. – user1906399

0

Для предотвращения навигации к файлу представления, т.е. http://[application_root]/application/views/pages/nonmember/email_notification.php

вы можете использовать следующий фрагмент кода в начале файла CodeIgniter:

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

Если, вместо этого, вы пытаетесь предотвратите доступ к веб-сайту для действия вашего контроллера, который показывает эту страницу, затем есть утилиты CLI, которые вы можете использовать: Codeigniter 2 restrict controller to command line

0

просто сделайте это «частным» методом. Вы можете использовать ключевое слово частного (аналогично поставить слово общественности перед методом) - и CodeIgniter позволяет создать приватный метод только с подчеркиванием перед именем метода

function index(){ 

     $this->_nonmember(); 

     } 

    function _nonmember($page = 'home'){ 

    … etc etc 

много преимуществ - частное имя методы не подвергается, и вы можете изменить название метода позже, если это необходимо.

function index(){ 

    $this->_someNewNonMemberMethod(); 

    } 

, но для пользователя его точно такой же.

======== Редактировать

хорошо Theres много различных решений и его до, как вы хотите, чтобы дизайн вашего приложения. Как и одно соображение, будут иметь отдельные контроллеры для членов и нечленов. Но для кода, который вы опубликовали, у вас уже есть отдельный метод регистрации, поэтому самым быстрым было бы создание быстрого частного метода для просмотра электронной почты, если вы не хотите, чтобы это было открыто.

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() ; 
+0

если я сделаю nonmember приватным методом, я не могу получить доступ к страницам из-за настройки маршрута. '$ route ['(: any)'] = 'main/nonmember/$ 1';' – user1906399

+0

ответил после редактирования – cartalot

Смежные вопросы