特定のコントローラーに対して認証されたユーザーのみを許可する単純なルーティングルールを作成しようとしています。
これを実現するために、プリコントローラーフックを実行し、ユーザーがciセッションを使用してログインしているかどうかを確認します。ただし、ユーザーがどのコントローラーにアクセスしたいかを知る必要があります。フック関数でこれをどのように知ることができますか?
特定のコントローラーに対して認証されたユーザーのみを許可する単純なルーティングルールを作成しようとしています。
これを実現するために、プリコントローラーフックを実行し、ユーザーがciセッションを使用してログインしているかどうかを確認します。ただし、ユーザーがどのコントローラーにアクセスしたいかを知る必要があります。フック関数でこれをどのように知ることができますか?
$ this-> router-> fetch_class();
CI_Controllerを拡張すると、これが機能するはずです。
ここで達成したいことのベストプラクティスはフックだとは思いません
次のことを試すことができます。認証チェックを行い、ユーザーを適切なコントローラーにリダイレクトするCI_Controllerの代わりに、拡張する中間コントローラーを作成する必要があります。
jondavidjohnによって作成されたこのチュートリアルをステップバイステップで読む
http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth
あなたは10分後にアイデアを得ることができるはずです
コントローラーコンストラクターに認証を設定することはできませんか?アイテムがインスタンス化されたときに呼び出され、そこでチェックを行うことができます。また、いつでもCI_Controllerを拡張し、そこにロジックを配置して、そこでチェックインできるようにすることができます(そして、提案されているようにthis-> router-> fetch_class()を使用します)。
拡張コントローラールートに行きたくなくて、そこにロジックが表示されている場合は、CIオブジェクトがpre_controller_hookに存在しないため、ここでネイティブPHPを使用する必要があります。
したがって、URIを取得し、それを解析してコントローラーを見つけます。
$uri = $_SERVER['REQUEST_URI'];
$segments = explode("/", $uri);
// if you're removing index.php from your urls, then
$controller = $segments[0];
// if you're not removing index.php
$controller = $segments[1];
自動ロードライブラリクラスでCI_Controllerを拡張します。
このようなもの:
class MyAuthLibrary extends CI_Controller {
var $ci;
function __construct() {
$this->ci = &get_instance();
$route = $this->ci->router->fetch_class();
if( ($route !== 'login') && !$this->ci->session->userdata('email_address') ) {
redirect('login');
}
}
}