プロジェクト

全般

プロフィール

Bug(バグ) #3933

Youichi Kimura さんが8年以上前に更新

h3. Overview (現象) 

 管理画面の「認証プラグイン設定」(/pc_backend.php/plugin/list?type=auth) から認証プラグインの設定ページを開き、全ての認証プラグインで「PC版有効設定」を「無効にする」に設定した状態で PC 版のログイン画面を開くと HTTP 500 エラーとなり、Web ブラウザ側にはエラーメッセージ等もない真っ白なページが表示される。 

 Apache 等のエラーログには下記のようなエラーが記録される: 

 <pre> 
 [Thu Apr 21 10:30:57.453033 2016] [fcgid:warn] [pid 1331:tid 140111127688960] [client 10.0.2.2:49636] mod_fcgid: stderr: PHP Fatal error:    Cannot instantiate abstract class opAuthAdapter in /var/www/sns/op36.localhost/lib/user/opAdaptableUser.class.php on line 99, referer: http://op36.localhost:8080/ 
 </pre> 

 類似の設定として、管理画面の「SNS設定」には「PC版使用設定」「携帯版使用設定」があるが、ここで無効に設定した場合は「このページにはアクセスできません。」とエラーメッセージが表示される。 
 認証プラグインの「PC版有効設定」および「携帯版有効設定」は、PC 版のみアクセス可能な SNS として設定したいなどの目的で無効に設定する可能性があるが、当チケットの現象ではユーザー側にメッセージを表示することもなく Fatal error で異常終了するという形で SNS が利用できなくなるため、「PC版使用設定」「携帯版使用設定」と比べて不親切である。 

 h3. Causes (原因) 

 source:lib/user/opAdaptableUser.class.php@43190aa1#L28 source:lib/user/opAdaptableUser.class.php@43190aa1#L82 

 <pre><code class="php"> 
   public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options getAuthAdapter($authMode = array()) null) 
   { 
     parent::initialize($dispatcher, $storage, $options); 
     if ($this->getMemberId() && $this->isTimedOut()) (!$authMode) 
     {    
       $this->getAttributeHolder()->removeNamespace('opSecurityUser'); 
     }    

     $request = sfContext::getInstance()->getRequest(); 
     $authMode = $request->getUrlParameter('authMode'); $this->getCurrentAuthMode(); 
     if ($authMode) 
     {    
       $this->setCurrentAuthMode($authMode); 
     }    

     $this->createAuthAdapter($this->getCurrentAuthMode()); $this->createAuthAdapter($authMode); 

     return $this->authAdapters[$authMode]; 
   } 
 </code></pre> 

 上記のコードで、利用可能な認証プラグインが存在しない状態で @$this->getCurrentAuthMode()@ が呼び出されると null が返るが、このメソッドではそのことが考慮されておらず @$this->createAuthAdapter()@ の @$authMode@   null を渡してしまう。 のまま @$this->createAuthAdapter($authMode)@ が実行されてしまう。 

 <pre><code class="php"> 
   public static function getAuthAdapterClassName($authMode) 
   { 
     return 'opAuthAdapter'.ucfirst($authMode); 
   } 
 </code></pre> 

 途中の呼び出し過程は省略するが、上記の @opAdaptableUser::getAuthAdapterClassName()@ メソッドにも @$authMode@ が null の状態で呼び出され、@'opAuthAdapter'@ の文字列が返される。そして @opAuthAdapter@ クラスを new でインスタンス化しようとすることで Fatal error が発生する。 

 h3. Way to fix (修正内容) 

 修正内容を記入 

戻る