.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

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

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

もっと...

.
.リンク集

メイン
   CakePHP モデル(Model)
     どのControllerでもログインは出来ますか?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
usaco
投稿日時: 2010-3-8 17:57
Baker スタート
登録日: 2009-7-16
居住地: Tokyo
投稿: 5
どのControllerでもログインは出来ますか?
AuthComponentでUsersController以外でログイン出来るよう設定を変えることは存じていますが、
UsersControllerに限らずどのControllerでもログインすることは出来るものなのでしょうか?

現在はUsersController以外でのControllerではログイン出来ないという認識なので、
私が作っている自動ログインのシステムは

■hogesController
ログインしていないユーザーはクッキーからパスポート確認あったら

■UsersController
UsersControllerのloginにリダイレクトし、ログインする

■hogesController
先ほど見ていたページにリダイレクト


という形をとっています。
ですが、外部リンクからだと認識出来なかったり、PEARのNet_IPv4を読み込もうと思っても、この自動ログインのシステムがネックで出来なかったりします。

これを、以下のように出来たらと思っています。
■hogesController
ログインしていないユーザーはクッキーからパスポート確認あったら、ログインする


UsersControllerに飛ばずにログイン出来る方法があればすべては解決するのですが、方法はありますでしょうか?
usaco
投稿日時: 2010-3-8 18:03
Baker スタート
登録日: 2009-7-16
居住地: Tokyo
投稿: 5
Re: どのControllerでもログインは出来ますか?
投稿者です、自動ログインのソースを提示します。
パスポートを調べてあったら、UsersControllerからpassport($user)を実行させています。


<?php
/**
     * パスポートがあるか調べる
     *
     * @param $user ユーザー情報
     */
    
function isLogin($user null) {
        
// 外部アクセスは認証しない
        
if (strstr($this->controller->referer(), 'http://')
            && !
strstr($this->controller->referer(), 'http://localhost/')) {
            return;
        }
        
// ログインしていない時の処理
        
if (empty($user)) {
            
$cookiePassport $this->Cookie->Read('User');
            
// クッキーがあった場合
            
if (!empty($cookiePassport)) {
                
// パスポート使用期限を調べる
                
$deadline date('Y-m-d H:i:s',
                    
strtotime("-" PASSPORT_TIME));
                
// パスポートを検索
                
$Passport ClassRegistry::init('Passport');
                
$passport $Passport->find('first', array(
                    
'conditions' => array(
                        
'Passport.passport' => $cookiePassport['passport'],
                        
'Passport.updated >' => $deadline
                    
)
                ));
                
// パスポートがあった場合
                
if (!empty($passport)) {
                    
// 現在のURLをセッションに記録
                    
$this->Session->write(
                        
'URL',
                        
'/' $this->controller->params['url']['url']
                    );
                    
$this->controller->redirect('/users/login');
                }
            }
        }
    }

    
/**
     * 自動ログインする
     *
     * @param $user ユーザー情報
     */
    
function passport($user null) {
        
// ログインしていない時の処理
        
if (empty($user)) {
            
$cookiePassport $this->Cookie->Read('User');
            
// クッキーがあった場合
            
if (!empty($cookiePassport)) {
                
// パスポート使用期限を調べる
                
$deadline date('Y-m-d H:i:s',
                    
strtotime("-" PASSPORT_TIME));
                
// パスポートを検索
                
$Passport ClassRegistry::init('Passport');
                
$passport $Passport->find('first', array(
                    
'conditions' => array(
                        
'Passport.passport' => $cookiePassport['passport'],
                        
'Passport.updated >' => $deadline
                    
)
                ));
                
// パスポートがあった場合
                
if (!empty($passport)) {
                    
$user['User']['mail'] = $passport['User']['mail'];
                    
$user['User']['password'] = $passport['User']['password'];
                    
// ログインに成功した時の処理
                    
if ($this->Auth->login($user)) {
                        
// セッションIDを振りなおす
                        
$this->Session->renew();
                        
// パスポート発行する
                        
$this->GateCommon->__passportWrite($passport);
                        
// URLのセッションの確認
                        
if ($this->Session->read('URL')) {
                            
$url $this->Session->read('URL');
                        } else {
                            
$url '/';
                        }
                        
$this->controller->redirect($url);
                    }
                }
            }
        }
    }
?>

hiromi2424
投稿日時: 2010-3-8 21:26
Baker 常連
登録日: 2009-11-23
居住地: 新潟
投稿: 58
Re: どのControllerでもログインは出来ますか?

<?php
$data 
= array('username' => '****','password' => '****');
$this->Auth->login($data);
?>


とすると、ログイン処理が行われます。

http://www.webdevelopment2.com/cakephp-auth-component-tutorial-3/

英語ですがこちらの記事に永続ログインについて詳しくチュートリアルが書かれています。
コードだけ追ってみても参考になるのではないかと思います。


----------------
単純な質問はCakeQsも使ってあげてください。
twitter
Blog

usaco
投稿日時: 2010-3-9 3:32
Baker スタート
登録日: 2009-7-16
居住地: Tokyo
投稿: 5
Re: どのControllerでもログインは出来ますか?
それだと、UsersControllerでしか作用しませんよね?
AuthというのはデフォルトでUsersControllerが指定されているからです。

<?php
$this
->Auth->userModel $this->model;
?>

という風に、もともとUsersController以外に設定することも出来ますが、User管理を別のモデルでするということで、目的とは違います。

amazonのサイトのように、どのページを開いても自動ログインされるシステムを作りたいのです。。
UsersControllerでも、PhotosControllerでもリダイレクトせずにログイン出来るようにしたいのです。
やはり、AuthComponentではどのページでもログインするというのは難しいのでしょうか。
hiromi2424
投稿日時: 2010-3-9 7:29
Baker 常連
登録日: 2009-11-23
居住地: 新潟
投稿: 58
Re: どのControllerでもログインは出来ますか?
引用:
それだと、UsersControllerでしか作用しませんよね?
AuthというのはデフォルトでUsersControllerが指定されているからです。

誤解です。
指定するのはプロパティ名どおりモデル名であって、どのコントローラでも、Authコンポーネント内部でUserモデルが確実に読み込まれる仕組みになっています。

英語の記事は読まれましたでしょうか。
手動でAuthComponent::startup()でするような処理が記述されていますので、参考になると思います。

追記:
更にいうならば、AuthComponent::login()と、UsersController::login()は別物です。
AppController::beforeFilter()で、$this->Auth->login()を呼べば、全コントローラ内で希望の処理ができると思います。


----------------
単純な質問はCakeQsも使ってあげてください。
twitter
Blog

usaco
投稿日時: 2010-3-9 13:04
Baker スタート
登録日: 2009-7-16
居住地: Tokyo
投稿: 5
Re: どのControllerでもログインは出来ますか?
hiromi2424さんの言葉がきっかけでようやく初歩的な間違いに気付きました。

$this->Auth->fieldsの設定をUsersControllerで変えていて、他のControllerではログイン出来なかったようです。

現在は指示どうり、AppController::beforeFilter()に$this->Auth->login()を呼んで、
$this->Auth->fieldsもAppControllerで行い、自動ログインの機能を作り変えました。
1ヶ月ほど未解決のままだったので、とてもスッキリしました。有難う御座います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .