人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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'
);

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


●質問者: FujiiRock
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●200ポイント ベストアンサー

コメントに書いたように「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');
?>

FujiiRockさんのコメント
詳細にわかりやすく説明いただき、誠にありがとうございますっ! 以下の感じで設定しているのですが、users/loginにリダイレクトされてしまいます。。 うーん。悩みます。。 class MemberController extends AppController { function beforeFilter() { $this->Auth->userModel = 'Member'; $this->Auth->allow( 'login', 'logout', ); $this->Auth->loginAction = array( 'controller' => 'member', 'action' => 'login' ); $this->Auth->loginRedirect = array( 'controller' => 'mypage', 'action' => 'index', ); $this->Auth->logoutRedirect = array( 'controller' => 'mypage', 'action' => 'logout' );

rouge_2008さんのコメント
AppControllerに設定していないでしょうか? 次のようなページを参考にしながら、ファイルを作成しませんでしたか? http://book.cakephp.org/1.3/ja/The-Manual/Tutorials-Examples/Simple-Acl-controlled-Application.html >> 次に行うことは、 AppController に変更を加えることです。/app/app_controller.php が存在しない場合は、作成してください。/app/controllers/ ではなく、/app/ に作成することに注意してください。コントローラ全体に認証と ACL を行うなら、この AppController に対してセットアップを行います。次のコードを加えてください。 >|| <?php class AppController extends Controller { var $components = array('Acl', 'Auth', 'Session'); function beforeFilter() { // AuthComponent の設定 $this->Auth->authorize = 'actions'; $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add'); } } ?> ||< << ※今確認している部分での動作に影響はないようですが、「$this->Auth->allow()」に「login」を指定すると誤作動するようですので、削除した方が良さそうです。 >> <span style="font-weight:bold;">allow</span> コントローラ中で認証を行わないアクション(例えば登録を行うアクション)があるのなら、 allow メソッドを使って AuthComponent がそのアクションを無視するようにできます。 次の例では、「register」アクションで認証を無視するようにしています。 決して、 allow メソッドに「login」という名前のアクションを適用しないでください。認証機能が誤作動します。 >|| $this->Auth->allow('register'); ||< 複数のアクションで認証をスキップするようにするなら、それらのアクション名を allow() メソッドのパラメータに渡してください。 >|| $this->Auth->allow('foo', 'bar', 'baz'); ||< <<

FujiiRockさんのコメント
ありがとうございますっ_(_ _)_ なるほど。全体に適用だからAppControllerですか。 あと、マニュアル読むようにします。。 それで、AppControllerに設定を移しMemberControllerから設定を削除したところで、 member/loginにリクエストすると、users/loginにリダイレクトするようになりました。 それで、いろいろとさわって、MemberControllerとAppController両方に Authの設定しましたら、アプリ全体でmember/loginへリダイレクトがかかるようになりました。 AppControllerがあれば、MemberControllerの方には不要にも感じますが、、 今は、とりあえず結果オーライでいます。。

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

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 アクションがログインを必要としないことを伝えています。 <<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ