Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
AuthComponentの改造 | suzukiのCakePHPブログ

AuthComponentの改造

追記2に修正を書きました

AuthComponentのパスワード自動ハッシュ化がネックになった。

詳細はねねとまつの小部屋さんをご覧頂くとして、

※stable版では、Auth->allow()に指定すれば、Model内のvalidationを使えるようになりそうです(2008/3/17更新)

とのことであるから、AuthComponentを上記の通りに改造しちゃえというのがこのエントリーの趣旨。

まずは(もう昨日の時点でやってあるんだけど)、
/cake/libs/controller/components/auth.phpを/app/controller/components/auth.phpにコピー。
で、これを編集する。
※stableになったらapp側を消すだけでいいからね。そういうことでしょ?

Auth.phpの

$this->data = $controller->data = $this->hashPasswords($controller->data);

これを、

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   return false;
  }

これの後ろにもっていくだけ。
おそらく、Auth->arrowに設定されたアクションならここでリターンされちゃうんで、
その後ろに書けば最初のAuth->hashPasswordsを書けば、
Auth->arrowに指定したアクションではhashPasswordsは発動しないというわけだ!

でも、自信が無いのでおかしい点に気づいた方がいらっしゃいましたら
指摘していただけると幸いです。
って、誰も見てないでしょうけども。

追記1

上記でいいかな~と思ったら、ユーザの追加がうまくいかない。
passwordの項目をはずすとUser->saveがうまくいくので、
Auth関係であることは間違いなさそう。
原因がわかったらまた書きます。

追記2

よくわからんけど、
どうやら

$this->data = $controller->data

これが無いとsaveがうまくいかないことがわかったので、
以下のように修正(function startupね)

  $this->data = $controller->data = $this->hashPasswords($controller->data);

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   return false;
  }

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   $this->data = $controller->data;
   return false;
  }
  $this->data = $controller->data = $this->hashPasswords($controller->data);

これでようやく動くようになった..

と、いうことはですよ?
よくわかってないんだけど、
Authで指定されたモデルはAuthの$this->data経由でsaveされるってことなのかな?

* * Again: this will **not** prevent inline script, e.g.: * . * * This workaround is possible because Safari supports the non-standard 'beforeload' event. * This allows us to trap the module and nomodule load. * * Note also that `nomodule` is supported in later versions of Safari - it's just 10.1 that * omits this attribute. * --> */ (function () { const check = document.createElement('script'); if (!('noModule' in check) && 'onbeforeload' in check) { let support = false; document.addEventListener( 'beforeload', (e) => { if (e.target === check) { support = true; } else if (!e.target.hasAttribute('nomodule') || !support) { return; } e.preventDefault(); }, true, ); check.type = 'module'; const blob = URL.createObjectURL( new window.Blob([], { type: 'text/javascript' }), ); check.src = blob; check.onload = () => { URL.revokeObjectURL(blob); }; document.head.appendChild(check); check.remove(); } })();