Как установить обратный URL при входе в систему на Codeigniter / Tank_Auth? - PullRequest
1 голос
/ 14 сентября 2011

Проблема здесь в том, что когда мой пользователь входит в мое приложение, они всегда перенаправляются на контроллер по умолчанию.

Я бы хотел, чтобы пользователь был перенаправлен на страницу, на которой он находился до входа в систему.

Так, например, если пользователь читает сообщение на форуме № 12 (для чтения не требуется вход в систему), а затем решает опубликовать ответ (для ответа требуется вход в систему), после входа в систему он должен вернуться к сообщению № 12.

Я использую PHP / Codeigniter 2.0.2 и библиотеку Tank_Auth и имею в своих контроллерах

function __construct()
{
    parent::__construct();

    if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {

        //load stuff 
     }

У меня вопрос

Каков наилучший способ установить возвращаемый URL (Cookie? GET?) И как это будет реализовано?

Если вы знакомы с Tank_Auth, в каких файлах мне следует указыватьвнести эти изменения?

Любые дорожные карты приветствуются, даже если вы не используете Tank_Auth.

Ответы [ 3 ]

8 голосов
/ 29 октября 2012

Я недавно внедрил это решение на веб-странице, где я работал.

В файле controller / auth добавьте ссылку на библиотеку user_agent :

function __construct()
{
    parent::__construct();
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation');
    $this->load->library('security');
    $this->load->library('tank_auth');
    $this->lang->load('tank_auth');
    $this->load->library('user_agent'); //This is the line you are adding
}

В views / auth / login_form.php и использовании библиотеки user_agent CodeIgniter добавьте скрытый тег , который будет содержать URL реферера выглядит следующим образом:

<?=form_hidden('redirect_url', $this->agent->referrer());?>
<?php echo form_submit('submit', 'Let me in'); ?>
<?php echo form_close(); ?>

После этого все, что вам нужно сделать, это перенаправить пользователей на содержимое ввода с именем "redirect_url" , когда пользователь отправляет данные для входа на действие входа :

/**
 * Login user on the site
 *
 * @return void
*/
function login()
{
    /*.... Beginning of the login action function...  
      ....
      ....
    */

    if ($this->tank_auth->login(
                $this->form_validation->set_value('login'),
                $this->form_validation->set_value('password'),
                $this->form_validation->set_value('remember'),
                $data['login_by_username'],$data['login_by_email'])) //valid
    {
        redirect( $this->input->post('redirect_url'));
    }
}

Это прекрасно работает для меня ... Это хорошо и просто. Я верю, что это может помочь вам.

Дайте мне знать о чем угодно.

4 голосов
/ 14 сентября 2011

Это решение, которое я использовал с tank_auth, возможно, оно не самое лучшее, но я обнаружил, что оно хорошо работает для меня.

В контроллере

if (!$this->tank_auth->is_logged_in()){
   $encoded_uri = preg_replace('"/"', '_', $_SERVER['REQUEST_URI']);
   redirect('/login/'.$encoded_uri);        
}elseif($this->tank_auth->is_logged_in(FALSE)){  // logged in, not activated
   redirect('/user/reactivate/');
}else{
   //Logged IN Stuff Here
}

Модифицированная функция входа в систему авторизации танка (controllers / auth.php)

function login($return_to = "")
{
    if ($this->form_validation->run()) {
        if ($this->tank_auth->login(
            $this->form_validation->set_value('login'),
            $this->form_validation->set_value('password'),
            $this->form_validation->set_value('remember'),
            $data['login_by_username'],
            $data['login_by_email'])) {
           //...Other Stuff Here
           $decoded_uri = preg_replace('"_"','/',$return_to);
           redirect($decoded_uri);
        }
    }
}

Возможно, вам потребуется изменить preg_replace на что-то другое, если ваши URL-адреса имеют_ в них я просто использовал это, потому что это работает для меня

РЕДАКТИРОВАТЬ

Я обновил функцию, это один из другого проекта, в котором мы сильно изменили материал аутентификации танка, так что если все немного по-другому, извините

Что касается передачи материала encode_uri, я добавил следующее в файл rout.php (config / rout.php)

$route['auth/login/(:any)'] = 'auth/login/$1';
$route['auth/login'] = 'auth/login'; //Probably don't need this one now
0 голосов
/ 17 ноября 2014

Привет, я решил это следующим образом

В вашем контроллере

Добавить это: $this->load->library(array('tank_auth');

if (!$this->tank_auth->is_logged_in()) {
  $encoded_uri = preg_replace('"/"', '_', $this->uri->uri_string());
  redirect('/auth/login/'.$encoded_uri);
} else { 
 // Logged IN Stuff Here    
}

In Tank Auth Controller (контроллеры / auth.php)

function login($return_to = "")
{
if ($this->form_validation->run()) {
    if ($this->tank_auth->login(
        $this->form_validation->set_value('login'),
        $this->form_validation->set_value('password'),
        $this->form_validation->set_value('remember'),
        $data['login_by_username'],
        $data['login_by_email'])) {
         // success
         $decoded_uri = preg_replace('"_"','/',$return_to);
         redirect($decoded_uri);
    }
}
}

Я заменил $_SERVER['REQUEST_URI'] на этот $this->uri->uri_string(), потому что это позволяет вам получить /controller/method/...etc. позже перенаправить в автоконтроллер бака

Это прекрасно для меня работает и как сказал @Cubed Eye "Возможно, вам придется изменить preg_replace на что-то другое, если ваши URL содержат _" Благодаря @Cubed Eye

Надеюсь, это поможет кому-то еще.

...