用户在codeigniter上进行身份验证后如何重定向到控制器的方法?

时间:2013-11-27 19:00:28

标签: codeigniter authentication redirect

我正在使用默认控制器进行用户身份验证。我想要做的是用户请求新闻/添加或新闻/索引或主题/全部或地图/视图的页面,如果他没有登录,他或她将被定向到登录页面然后重定向到他想要去的页面,并不总是相同的页面。

3 个答案:

答案 0 :(得分:0)

一种方法是在控制器的构造函数中执行此操作。这样他们在进入新闻/添加等之前被重定向。

因此,例如,您创建一个名为“sentry”的模型和一个“getUser()”方法来检查浏览器cookie以查看用户是否已获得授权。如果他们没有被授权,则返回false。如果他们被授权让它返回$ user,那么你可以将它用于其他方法。

function __construct() {

    parent::__construct();

    $this->load->model( 'sentry' );

    if ( ! $this->user = $this->sentry->_getUser() ) 
            { redirect( '/login/', 'refresh' );     }

    } 

所以那么例如你可以将$ this-> user-> name等用于控制器中的任何方法。并且$ this->用户也将自动在该控制器的所有视图文件中可用。

答案 1 :(得分:0)

你可以 CodeIgniter User Agent LibrarySession Library存储和使用引用网址。用户代理库基本上访问$ _SERVER ['HTTP_REFERER']值。

注意:来自php.net网站:

  

并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER修改为功能。简而言之,它无法真正被信任。

所以这不是一个万无一失的方法。

if ($this->agent->is_referral()) {
    $this->session->set_userdata('prev_url', $this->agent->referrer());
}

// later, when login is successful
$prev_url = $this->session->userdata('prev_url');
if( $prev_url ) {
    redirect($prev_url);
}

答案 2 :(得分:0)

我这样做是通过扩展我的控制器来检查构造函数是否有人登录,如果有人登录我保存到会话当前URL,并将人员重定向到登录页面(如果应用相同的构造函数(控制器一)我登录后我将当前URL保存到会话中除外我将调用重定向功能调用到会话变量。

如何扩展您的控制器是在http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

完成的

请注意,当你的控制器扩展时,你使用$this->data['variable_sent_to_view'],你可以省略$this->load->view()的第二个参数

这里有一些示例代码,假设您知道您的登录控制器如何工作

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

class MY_Controller extends CI_Controller {

    function __construct() {

        parent::__construct();
        $this->output->enable_profiler(FALSE);

        if ($refer = $this->session->flashdata('refer')) {

            $this->data['refer_page'] = $refer; // $this->data['refer_page'] is variable that you are interested in
            unset($refer);

        } else {

            $this->data['refer_page'] = base_url(); //default refer_page

        }


        //check if user is NOT logged in
        if (!$logged_in) {

            $this->_setRefer(); //this is private function

        }
        // else dont care about it
    }

    private function _setRefer() {


        $invalid_method = array('search', 'login'); // if method is 'search' or 'login' url will not save in session (it will stay same as was before)
        $valid_refer = TRUE;


        if (in_array($this->router->method, $invalid_method)) {

            $valid_refer = FALSE;

        }

        if (!(count($_POST) > 0) && $valid_refer === TRUE && !$this->input->is_ajax_request()) {

            $this->session->set_flashdata('refer', current_url());

        } else {

            $this->session->set_flashdata('refer', $this->data['refer_page']);

        }

    }

}

现在在成功登录后重定向到$ this-&gt; data ['refer_page'],但请注意登录控制器必须通过MY_Controller扩展。

这个脚本还会注意如果用户犯了错误并插入了错误的密码会发生什么(页面会重新加载但是“旧的”网址会停留)