.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
15 人のユーザが現在オンラインです。 (15 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 15

もっと...

.
.リンク集

メイン
   helper,component,script
     Auth | admin routing を利かせた url へ loginRedirect させる
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
custar
投稿日時: 2008-8-10 15:36
Cake 職人
登録日: 2007-5-31
居住地:
投稿: 189
Auth | admin routing を利かせた url へ loginRedirect させる
- 5.2.6.4 loginAction

cookbook の上記ドキュメント中のサンプルでは


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


と書かれていますが、これは次のように指定することも可能です。


(2) $this->Auth->loginAction = "/members/login";


ここで気になるのが、(1) 右辺の配列 第1項の "admin" => false。
これは Routing.admin を使わないことを意味しているようです。

注意が必要なのは、

"admin" というキーがあたかも Routing."admin" の "admin" を指しているような印象を受けてしまい、
"admin" => true とすれば Routing.admin が有効になった任意の url を作り出せる
と類推 (誤解) してしまいます。
私自身、そう誤解していました。


(3) $this->Auth->loginRedirect = array(
      "admin"      => true,
      "controller" => "members",
      "action"     => "index");
(4) $this->Auth->loginRedirect = "/admin/members/index";


これは、Routing.admin がデフォルト値の "admin" ならば問題ありません。

でも、Routing.admin を他の文字列、例えば "manager" にすると
manager_index へリダイレクトされません。

Routing.admin を "manager" に変えた時は、


(5) $this->Auth->loginRedirect = array(
      "manager"    => true,
      "controller" => "members",
      "action"     => "index");


のように "admin" を "manager" に書き換えるとうまくいきます。

でも、Routing.admin を書き換えていたなんて忘れてしまいそうです。
なので、


(6) $this->Auth->loginRedirect = array(
      Configure::read("Routing.admin") => true,
      "controller" => "members",
      "action"     => "index");


としておくべきなのかもしれませんが、こんなの一々やってられない。
(3) のように書いておけば、フレームワーク内で適切に書き換えてくれるのが嬉しい筈。

という訳で、フレームワーク内をちょっといじります。


[cake/libs/controller/components/auth.php]
function redirect($url = null) 
{
  if (!is_null($url)) 
  {
    return $this->Session->write('Auth.redirect', $url);
  }
  
  if ($this->Session->check('Auth.redirect')) 
  {
    $redir = $this->Session->read('Auth.redirect');
    $this->Session->delete('Auth.redirect');

    if (Router::normalize($redir) == Router::normalize($this->loginAction)) 
    {
      $redir = $this->loginRedirect;
    }
  } 
  else 
  {
    $redir = $this->loginRedirect;
+
+   $adminKey = Configure::read("Routing.admin");
+   
+   if (is_array($redir)
+     && isset($redir["admin"])
+     && $redir["admin"]
+     && "admin" != $adminKey)
+   {
+     $redir[$adminKey] = true;
+     unset($redir["admin"]);
+   }
  }

  return Router::normalize($redir);
}


これで (7) は (8) と同じになります。


(7) $this->Auth->loginRedirect = array(
      "admin"      => true,
      "controller" => "members",
      "action"     => "index");
(8) $this->Auth->loginRedirect = "/manager/members/index";


自分にとって分かりづらかったので、変更したまでで参考にならないかもしれ
ませんが、何か不具合があったら、報告してください。
custar
投稿日時: 2008-8-11 18:13
Cake 職人
登録日: 2007-5-31
居住地:
投稿: 189
Re: Auth | admin routing を利かせた url へ loginRedirect させる
不具合です。

引用:

custarさんは書きました:


$redir = $this->loginRedirect;

$adminKey = Configure::read("Routing.admin");

if (isset($redir["admin"]) && $redir["admin"] && "admin" != $adminKey)
{
  $redir[$adminKey] = true;
  unset($redir["admin"]);
}



これは $this->loginRedirect が array() の場合は正常動作しますが、
string で指定されている場合は期待通り動きません。
# テストしてなかった私が悪い。

例えば、$this->loginRedirect = "/users/index" の場合、

isset($redir["admin"]) => true .......えぇ!?
$redir["admin"] => true .......えぇ!?

なんという柔軟な (型の緩い) 言語。

という訳で修正。分かりずらいから入れ子の if で。


if (is_array($redir))
{
  if (isset($redir["admin"]))
  {
    if ($redir["admin"])
    {
      if ("admin" != $adminKey)
      {
        $redir[$adminKey] = true;
        unset($redir["admin"]);
      }
    }
  }
}


前述のコードには is_array($redir) を if に追加しています。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .