cakephp1.3 で静的ファイルを置きたいので、

views/pages以下にpr.ctpという静的ファイルを設置し、
以下が有効にした状態で、
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));

http://domain/pages/pr/ にアクセスしましたが、
そこで、なぜか、authコンポーネントが動いているようで、
http://domain/user/login
リダイレクトしています。

そもそも、ログイン画面は、userではなくmypageに指定してるので、
http://domain/mypage/login
になるのが理想ですが、そうはなりません。

設定ミスかと思い、以下を参照しましたが、設定は有効にされています。
$this->Auth->logoutRedirect = array(
'controller' => 'mypage',
'action' => 'logout'
);

考えられる原因について教えてほしいです。。。
どうぞよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/01/19 17:29:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント200pt

コメントに書いたように「logoutRedirect」はログアウト時のリダイレクト先です。
未ログイン状態で認証が必要なページにアクセスした時のリダイレクト先は、デフォルトで「users」コントローラーの「login」アクションになっていますが、「loginAction」で変更可能です。
ちなみに「loginRedirect」はログイン時(※認証が成功した時)のリダイレクト先です。

http://book.cakephp.org/1.3/ja/The-Manual/Core-Components/Authentication.html

loginAction
ログインを行うアクションをデフォルトの /users/login から変更します。

<?php
    $this->Auth->loginAction = array('admin' => false, 'controller' => 'members', 'action' => 'login');
?>

loginRedirect
通常、 AuthComponent は認証が実行されるまえのコントローラ/アクションのペアを記憶しており、認証が成功したらユーザをそこにリダイレクトします。しかし、この変数に特定のコントローラ/アクションのペアを定義することで、そこへ強制的にリダイレクトするようにできます。

<?php
    $this->Auth->loginRedirect = array('controller' => 'members', 'action' => 'home');
?>

logoutRedirect
デフォルトでは、ログアウト後にユーザは自動的にログインアクションへリダイレクトされます。 このリダイレクト先のアクションを定義できます。

<?php
    $this->Auth->logoutRedirect = array(Configure::read('Routing.admin') => false, 'controller' => 'members', 'action' => 'logout');
?>
他3件のコメントを見る
id:yayayai

すみません。別の質問が締切りしようとしたらキャンセルになってしまいました。
なんでそちらで回答いただいた分を含めて、お礼ポイントご返却しますね。
ありがとうございました。

2013/01/19 17:28:53
id:rouge_2008

わざわざもう一つの質問のポイントまでありがとうございます。
有り難く頂戴いたしました。


> AppControllerがあれば、MemberControllerの方には不要にも感じますが、、

もしかしてbeforeFilter()を残して、memberコントローラ専用の「$this->Auth->allow('logout', 'index');」だけ設定してあるのですか?
この場合、次のようにするといいようです。

class MemberController extends AppController {

	var $name = 'Member';


	function beforeFilter() {
		// 親クラスのbeforeFilter()
		parent::beforeFilter();
		$this->Auth->allow('logout', 'index');

		// 他にもmemberコントローラ専用の設定が必要な場合はここに記述します。
	}

	function login() {
		
	}

	function logout() {
		$this->redirect($this->Auth->logout());
	}

	function index() {
		/* ... */
	}

}

※全体に適用する設定をAppControllerに設定しておいて、MemberController専用の設定をしますが、その際に「parent::beforeFilter()」でAppControllerの設定も読み込んで適用させます。

http://techracho.bpsinc.jp/baba/2010_06_14/1748

CakePHPでは、AppControllerのbeforeFilter()で、Authコンポーネントの設定など色々な処理を書くと思います。

各コントローラでbeforeFilter()をオーバーライドした際、よくparent::beforeFilter()を呼び忘れてハマるのは、たぶん私だけではないですよね?

そこで、呼び忘れを防止する簡単な対策です。



1.3では解説されていないので2.0用になりますが、こちらが分かりやすいと思います。

http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html

// app/Controller/AppController.php
class AppController extends Controller {
    //...

    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
            'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home')
        )
    );

    public function beforeFilter() {
        $this->Auth->allow('index', 'view');
    }
    //...
}

~(略)~

beforeFilter 関数で、AuthComponentに全てのコントローラの index と view アクションでログインを必要としないように伝えました。 サイトに登録していない訪問者にエントリを読ませたりリストを見せたりすることができるようにしたのです。

// app/Controller/UsersController.php

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('add'); // ユーザーに自身で登録させる
}

~(略)~

beforeFilter 関数がAuthComponentにAppControllerの beforeFilter 関数で許可されていた index と view アクションに加え、 add アクションがログインを必要としないことを伝えています。

2013/01/19 21:01:19
  • id:rouge_2008
    『静的ファイルを置きたいので、views/pages以下にpr.ctpという静的ファイルを設置し』たのはなぜでしょうか?
    「views」ディレクトリ配下はテンプレートファイルですし、コントローラーを通して表示しているので動的生成になっているはずですが・・・
    静的ファイルを置く場合は、公開ディレクトリ(※デフォルトでは「webroot」)に、そのままの階層で配置します。
    ※「http://domain/pages/pr.html」で表示する場合は、公開ディレクトリに「pages」フォルダを作成して「pr.html」を入れます。
    ※「http://domain/pages/pr」で表示する場合は、上記と同じようにhtmlファイルを配置した他に、「.htaccess」で「MultiViews」を有効にします。(もし可能な場合は、Apacheの設定ファイルに記述しても大丈夫です。)
    http://1-byte.jp/2010/09/18/multi_views_for_php_and_apach2/
    http://httpd.apache.org/docs/2.2/ja/content-negotiation.html


    ※「http://domain/pages/pr/」で表示する場合も同様にします。(「pages」内にさらに「pr」フォルダを作成して「index.html」を配置)


    ※ちなみに「$this->Auth->logoutRedirect 」はログアウト時のリダイレクト先のはずです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません