2012-02-07 4 views
0

Я просто полностью в тупике, так же как и мой друг, создавший эту систему шаблонов.Параметры для активации страницы

У меня есть страница регистрации, которая отправляет пользователю электронное письмо со ссылкой на страницу активации учетной записи, в которой они должны заполнить там пароль для подтверждения. Внутри ссылки находится их user_id и случайная строка для регистрационного ключа.

Вот что я нормальный URL будет выглядеть следующим образом:

kansasoutlawwrestling.com/kowmanager/activate/10000/da54d6fad5fa5fadf

То, что я хочу сделать, это если один из этих утверждений верны, то это показывает мой 404 страница ошибки:

  1. не имеет user_id в URL
  2. не имеет регистрационный ключ в URL
  3. Не имеет либо два параметра в URL

Активация контроллера:

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

class Activate extends CI_Controller 
{ 

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->library('kow_auth');    
} 

public function index($param1 = NULL, $param2 = NULL) 
{ 
    //Config Defaults Start 
    $msgBoxMsgs = array();//msgType = dl, info, warn, note, msg 
    $cssPageAddons = '';//If you have extra CSS for this view append it here 
    $jsPageAddons = '<script src="http://www.kansasoutlawwrestling.com/kowmanager/assets/js/activatevalidate.js"></script>';//If you have extra JS for this view append it here 
    $metaAddons = '';//Sometimes there is a need for additional Meta Data such in the case of Facebook addon's 
    $siteTitle = '';//alter only if you need something other than the default for this view. 
    //Config Defaults Start 


    //examples of how to use the message box system (css not included). 
    //$msgBoxMsgs[] = array('msgType' => 'dl', 'theMsg' => 'This is a Blank Message Box...'); 

    /**********************************************************Your Coding Logic Here, Start*/ 

    $x = 0; 
    if(($param1 !== NULL)&&($param2 !== NULL)) 
    { 
     //params not null yay.. 
     if((isset($param1))&&((trim($param1) !== '')||(!empty($param1)))) 
     { 
      if(!is_numeric($param1)) 
      { 
       $x++; 
      } 
     } 
     if((isset($param2))&&((trim($param2) !== '')||(!empty($param2)))) 
     { 
      if(!is_string($param2)) 
      { 
       $x++; 
      } 
     } 
    } 
    else 
    { 
     $x++; 
    } 


    if($x !== 0) 
    { 
     $bodyContent = "error_page"; 
    } 
    else 
    { 
     $bodyContent = "activate_form"; 
    } 



    $bodyType = "full";//type of template 

    /***********************************************************Your Coding Logic Here, End*/ 

    //Double checks if any default variables have been changed, Start. 
    //If msgBoxMsgs array has anything in it, if so displays it in view, else does nothing.  
    if(count($msgBoxMsgs) !== 0) 
    { 
     $msgBoxes = $this->msgboxes->buildMsgBoxesOutput(array('display' => 'show', 'msgs' =>$msgBoxMsgs)); 
    } 
    else 
    { 
     $msgBoxes = array('display' => 'none'); 
    } 

    if($siteTitle == '') 
    { 
     $siteTitle = $this->metatags->SiteTitle(); //reads 
    } 

    //Double checks if any default variables have been changed, End. 

    $this->data['msgBoxes'] = $msgBoxes; 
    $this->data['cssPageAddons'] = $cssPageAddons;//if there is any additional CSS to add from above Variable this will send it to the view. 
    $this->data['jsPageAddons'] = $jsPageAddons;//if there is any addictional JS to add from the above variable this will send it to the view. 
    $this->data['metaAddons'] = $metaAddons;//if there is any addictional meta data to add from the above variable this will send it to the view. 
    $this->data['pageMetaTags'] = $this->metatags->MetaTags();//defaults can be changed via models/metatags.php 
    $this->data['siteTitle'] = $siteTitle;//defaults can be changed via models/metatags.php 
    $this->data['bodyType'] = $bodyType; 
    $this->data['bodyContent'] = $bodyContent; 
    $this->load->view('usermanagement/index', $this->data); 
} 

function activate_submit() 
{   
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|min_length[6]|max_length[12]|alpha_numeric'); 

    $user_id   = $this->uri->segment(3); 
    $registration_key = $this->uri->segment(4); 

    if (($registration_key == '') OR ($user_id == '')) 
    { 
     echo json_encode(array('error' => 'yes', 'message' => 'URL was not complete!')); 
    } 
    else 
    { 
     if (!$this->form_validation->run()) 
     { 
      echo json_encode(array('error' => 'yes', 'message' => 'There was a problem submitting the form! Please refresh the window and try again!'));  
     } 
     else 
     {       
      if ($this->kow_auth->activate_user($user_id, $registration_key, $this->input->post('password'))) 
      { 
       echo json_encode(array('sucess' => 'yes', 'message' => 'Your account has been successfully activated!')); 
      } 
      else 
      {               
       echo json_encode(array('error' => 'yes', 'message' => 'The activation code you entered is incorrect or expired!')); 
      } 
     } 
    } 


} 

} 

/* End of file activate.php */ 
/* Location: ./application/controllers/activate.php */ 

Маршруты:

$route['activate/:num/:any'] = 'activate/index/$1/$2'; 
$route['404_override'] = 'error'; 

Вот что я получаю для каждого из этих случаев:

kansasoutlawwrestling.com/kowmanager/activate - правильный

kansasoutlawwrestling.com/kowmanager/activate/10000/ - правильно

kansasoutlawwrestling.com/kowmanager/activate/10000/271cce33ab11ced5fd10aeca41323a3c - некорректный должны показывать форме АКТИВИРУЙТЕ

EDIT: Кто-нибудь есть какие-либо идеи, потому что кажется, что ничего не работает.

ответ

1

Начну упростив чуток проверку Params:

$this->error = FALSE; 

if(NULL != $param1 AND NULL != $param2) 
{ 
    if(!is_numeric($param1) OR (string)trim($param2)!= '') 
    { 
    $this->error = TRUE; 
    } 
} 
else 
{ 
    $this->error = TRUE; 
} 

$this->data['bodyContent'] = $this->error? 'error_page' : 'activate_form'; 

это поздно здесь, так что я мог бы испортил что-то, но в основном :

  1. если оба параметра равны нулю, установите значение $ error to ИСТИНА (они не должны быть пустыми);
  2. , если по крайней мере один не равно нулю:
    - если param1 не является числовым значением (идентификатор пользователя) или
    - если param2 не является строкой (и даже пустого), $ ошибка снова TRUE.

В конце, если ошибка FALSE (как инициализирована), мы передаем значение «activate_form» в представление else (т. Е. Если какое-либо из вышеуказанных условий вызвало ошибку в TRUE), мы передайте значение «error_page».

Кроме того, согласно документации, пользовательские маршруты должны идти после основных из них:

$route['404_override'] = 'error'; 
$route['activate/(:num)/(:any)'] = 'activate/index/$1/$2'; 
+0

Те же сообщения об ошибках. –

+0

Это действительно странно –

+0

Точно такая же ситуация? работает для первых двух, но не для последнего маршрута? –

1

Посмотрите на Tank Auth

Это библиотека CI, которая уже делает это, но с ключевым отличием, вы не хотите, чтобы передать больше, чем нужно. Поэтому просто создайте HASH (например, зашифрованный), который позволяет вам одновременно активировать идентификатор пользователя &.

Это меньше проверки и меньше проблем с копией &. Также устраняет необходимость делать все это Дополнительная проверка срока действия идентификатора + хэш-код.

Но, как я уже сказал, посмотрите на код авторизации танков и вытащите то, что вам нужно для активации, его довольно прямолинейно и уже для CI.

+0

Я сделал это, но я не уверен, что моя проблема с моим кодом. –

+1

Это будет иметь некоторые достоинства, если вопрос будет вращаться вокруг некоторой потребности в концепции избыточного веса как Tank Auth. но вопрос, кажется, задает вопрос о маршрутизации больше, чем что-то связанное с этой фактической верификацией. – chris

+0

@chris, я согласен, я пытался предоставить альтернативный упрощенный подход, когда Джеффу не нужно проверять 2 вещи и иметь несколько условий (плохой пользователь, плохой хеш, действительный пользователь, плохой хэш и т. Д.) – Jakub

1

Из любопытства ... что произойдет, если вы удалите следующую строку?

if(!is_string($param2)) 

И вы просто:

if((isset($param2))&&((trim($param2) !== '')||(!empty($param2)))) 
{ 
$x++; 
} 
1

Вам не нужно, чтобы создать новый controlller/модуль для активации учетной записи, просто добавить новый метод внутри существующей AUTH контроллер/модуль.

Если вы установили маршрут с условиями и они терпят неудачу, ваш показали ошибку или 404.

class Auth extends CI_Controller 
{ 
    public function __construct(){parent::__construct();} 
    /** 
    * Activate user account 
    * $route['activate/(:num)/(:any)'] = 'auth/activate/$1/$2'; 
    */ 
    public function activate($uid, $code) 
    { 

     //if need be, double check 
     if(!$uid OR !$code){show_404();} //BOTH need to exists 

     //if $route['activate/(:num)/(:any)'] = 'auth/activate/$1/$2'; FAILS CI will show error or 404 

     //grab $code and $uid and seek a match from DB, if failure do your own errors. 
    } 
} 

Я хотел бы предложить удаление идентификатора пользователя из Ури сегмента и сделать код активации УНИКАЛЬНОГО дБ ограничение так вам нужно только запросить это.

+0

У вас есть контроллер auth. У меня есть контроллеры входа/выхода/активации/регистрации. Я сделал это, чтобы облегчить работу с моей системой шаблонов. У меня есть –

+0

, возможно, вы не понимали, что я сказал, прежде чем я не хочу, чтобы контроллер auth. –

+0

Я понял ваш вопрос, я только добрался до вашего ответа. Как я уже сказал, CI будет следить за сбоем сегмента URI для вас, если вы установили условия на маршруте. переименуйте класс Auth, чтобы активировать и перенаправить туда. Просто скажите маршрут, который вы ожидаете от int или string (CI также будет искать allow_uri_chars), поэтому действительно все, что вам нужно сделать, это запросить БД, чтобы убедиться, что ключ верен. – Philip