■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。

Coo > 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/2 18:37
たぶん認証プレフィックス機能がうまく理解できていないのだと思います・・・ご教授ください。

先日、v3.0.7にUPしたのですが、それまでv3.0.6で日本語の会員専用ブログを用意し正常作動していました。
今回、英語の会員専用ブログも追加することになりました。

どちらも今までの日本語ブログと同じ ID/PW で見れるようにしたいのですが、
ログイン画面は 日本語ブログ⇒日本語ログイン画面 英語ブログ⇒英語ログイン画面 と表示したいです。

用意されている認証プレフィックス設定を利用し
front :日本語、mypage :英語
と割り当て、ユーザーグループの認証プレフィックスで両方をチェックし(v.3.0.7の新機能)
なんとか想定動作は実現できました。

が、ログイン画面のデザインが異なってしまいます。
日本語・・・メニュー、フッダが表示される 
※キャプチャ1


英語(今回追加)・・・メニュー、フッダが表示されないシンプルな画面
※キャプチャ2


ログイン画面のデザインを同じにするには、どうしたら良いでしょうか。

■調整した箇所
▽認証プレフィックス設定 で front,mypage を有効にする
app/Config/setting.php

 // フロント(例)
 'front' => array(
  // 認証設定名
   'name'   => '会員専用',
  // 認証後リダイレクト先
   'loginRedirect' => '/member_contents/index',
  // ログイン画面タイトル
  'loginTitle' => '会員専用ページ',
  // モデル
   'userModel'  => 'User',
  // ログインページURL
   'loginAction' => '/users/login',
  // ツールバー利用
   'toolbar'  => false,
  // セッションキー
   'sessionKey' => 'Front'
 ),
 // マイページ(例)
 'mypage' => array(
  // 認証設定名
   'name'   => 'MemberOnly',
  // URLにおけるエイリアス
 //   'alias'   => 'mypage',
  // 認証後リダイレクト先
   'loginRedirect' => '/e_member_contents/index',
  // ログイン画面タイトル
   'loginTitle' => 'Member Only',
  // モデル
   'userModel'  => 'Member',
  // ログインページURL
   'loginAction' => '/mypage/members/login',
  // ツールバー利用
   'toolbar'  => false,
  // セッションキー
   'sessionKey' => 'Mypage',
 )


▽User 用のログイン画面の調整。
/bcms/lib/Baser/View/Users/admin/login.php

画面タイトル を固定にし、PW問い合わせを削除する。

※v3.0.6 では
テーマ/Users/login.php
にコピーして調整していたのですが、今回デザインが崩れました。
画面上部に表示されるべきメニューが、ログインボタンの下、フッダのすぐ上に表示されてしまいます。
 ※キャプチャ3


全く同じファイルなのですが、コアファイルと置き換えたところ
デザインが正しく表示されたので、それで回避している状況です。

▽mypage 用のログイン画面の調整。
テーマ/Members/mypage/login.php

/bcms/lib/Baser/View/Members をテーマにコピー。
画面タイトル、アカウント、パスワード を英語表記にし、PW問い合わせを削除する。

▽直接ブログにアクセスされた場合、未ログインの場合はログイン画面を表示
テーマ/Layouts/default.php (日本語ページ用),e_default.php (英語ページ用に用意したもの)

ページ先頭に追記。

 <?php
 // 簡易認証:(メンバーページログイン)
 $text = $_SERVER['REQUEST_URI'];

 $epat = '/e_member_contents/';
 $pat = '/member_contents/';

 if(preg_match($epat,$text)){
     //未ログイン だったら  英語ログイン にリダイレクト
     if(!isset($this->viewVars['user'])){
       header("Location: ../mypage/members/login");
     }
 }elseif(preg_match($pat,$text)){
     //未ログイン だったら  日本語ログイン にリダイレクト
     if(!isset($this->viewVars['user'])){
       header("Location: ../users/login");
     }
 }
 ?>

※参照ページ:
デザイナーさんでも出来る! baserCMS のプレフィックス認証機能を使ったログイン画面の作り方


▽管理ツールでユーザーグループの認証プレフィックス設定。
「 会員専用」「MemberOnly」にチェック。

※すでに登録してあったユーザーグループの、認証プレフィックスを変更しました。
なお、新規ユーザーグループを作れませんでした。どう入力してもエラーになります。
「入力エラーです。内容を修正してください。 認証プレフィックスを入力してください。」

▽このユーザーグループに、ユーザーアカウント「member」が登録済です。
※実装済だった日本語会ブログ用のアカウントです。

できれば、日本語ログインのデザインにしたいですが、英語ログインのデザインでも構いません。

よろしくお願いします。

■ BaserCMSのバージョン:3.0.6.1→3.0.7
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ
■ 利用しているデータベース:SQLite

Coo > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/3 11:32
英語ログインがうまく動作していないことがわかりました。
正しいID/PWを入力してログインすると、しばらくそのまま待たされてエラーになります。
昨日はうまくいっていたと思うのですが、勘違いだったのかもしれません・・・

▽IE11:baserCMS のエラー画面
不正なリクエストと判断されました。(type:csrf)CSRF対策によるエラーです。
リクエストに含まれるCSRFトークンが不正または無効である可能性があります。
Request URL: /mypage/members/login

▽Chrome:Webのエラー画面
このウェブページにはリダイレクト ループが含まれています.
http://xxxxx のウェブページは リダイレクトの回数が多すぎます。このサイトの Cookie を削除するか、
サードパーティの Cookie を許可すると問題が解決することがあります。 引き続き問題が解決しない場合は、ご使用のコンピュータではなく、サーバー側の設定上の問題である 可能性があります。
この問題の詳細については、こちらをご覧ください。
エラー コード: ERR_TOO_MANY_REDIRECTS

▽firefox:Webのエラー画面
ページの自動転送設定が正しくありません
このアドレスへのリクエストに対するサーバの自動転送設定がループしています。
Cookie を無効化したり拒否していることにより、この問題が発生している可能性もあります。


●デバック状況
IE11はbaserCMSのエラーでしたので、デバックモードにして確認しました。
error.log の内容です。

----------------------------------
2015-04-03 11:13:40 Error: [BadRequestException] 不正なリクエストと判断されました。(type:csrf)CSRF対策によるエラーです。リクエストに含まれるCSRFトークンが不正または無効である可能性があります。
Request URL: /mypage/members/login
Stack Trace:
#0 [internal function]: BcAppController->_blackHoleCallback('csrf')
#1 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Controller/Component/SecurityComponent.php(623): call_user_func_array(Array, Array)
#2 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Controller/Component/SecurityComponent.php(337): SecurityComponent->_callback(Object(MembersController), '_blackHoleCallb...', Array)
#3 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Controller/Component/SecurityComponent.php(242): SecurityComponent->blackHole(Object(MembersController), 'csrf')
#4 [internal function]: SecurityComponent->startup(Object(MembersController))
#5 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Utility/ObjectCollection.php(128): call_user_func_array(Array, Array)
#6 [internal function]: ObjectCollection->trigger(Object(CakeEvent))
#7 /home/users/1/lolipop.XXXXX/web/bcms/lib/Baser/Event/CakeEventManager.php(244): call_user_func(Array, Object(CakeEvent))
#8 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Controller/Controller.php(675): CakeEventManager->dispatch(Object(CakeEvent))
#9 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Routing/Dispatcher.php(187): Controller->startupProcess()
#10 /home/users/1/lolipop.XXXXX/web/bcms/lib/Cake/Routing/Dispatcher.php(165): Dispatcher->_invoke(Object(MembersController), Object(CakeRequest))
#11 /home/users/1/lolipop.XXXXX/web/bcms/app/webroot/index.php(151): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#12 {main}
2015-04-03 11:14:29 Error: [MissingControllerException] Controller class Robots.txtController could not be found.
Exception Attributes: array (
'class' => 'Robots.txtController',
'plugin' => NULL,
)
Request URL: /robots.txt
Stack Trace:
#0 /home/users/1/lolipop.XXXXX/web/bcms/app/webroot/index.php(151): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse))
#1 {main}
----------------------------------

●日本語ログインは正常に行えます。
日本語でログイン済になれば、英語ログインは不要になるので、英語の会員ブログも正常に表示されます。

●ログイン画面は日本語・英語共通にして、Call元に合わせて表示先を変更する という方法でも良いのですが。

「日本語 会員ブログ」をクリック ⇒ 日本語・英語 共通のログイン画面 ⇒日本語 会員ブログ
「英語 会員ブログ」をクリック ⇒ 日本語・英語 共通のログイン画面 ⇒英語 会員ブログ

何かお分かりになりましたらご教授ください。

■ BaserCMSのバージョン:3.0.6.1→3.0.7
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ
■ 利用しているデータベース:SQLite

n1215 > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/9 0:57
Coo 様

まずはリダイレクトループ周りから解消しましょうか

ご提示いただいたコードではLocationヘッダに相対パスを記述されていますが、
Locationヘッダの値はRFCでは絶対URI(http:// や https:// などスキーム名を含むパス)と決まっています。
まずはその点を修正していただければと思います。

【参考】
RFC 2616 Header Field Definitions
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
引用:

14.30 Location

The Location response-header field is used to redirect the recipient to a location other than the Request-URI for completion of the request or identification of a new resource. For 201 (Created) responses, the Location is that of the new resource which was created by the request. For 3xx responses, the location SHOULD indicate the server's preferred URI for automatic redirection to the resource. The field value consists of a single absolute URI.

Location = "Location" ":" absoluteURI

Twitter: @n_1215

Coo > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/9 16:07
n1215 様

ご教授ありがとうございます。
絶対パスに変更してみましたが、http://www.XXXX/mypage/members/login で表示されるログイン画面で正しいID/PWをするとリダイレクトループになります。


if(preg_match($epat,$text)){
    //未ログイン だったら  英語ログイン にリダイレクト
    if(!isset($this->viewVars['user'])){
	     header("Location: http://www.XXXX/mypage/members/login");
    }
}elseif(preg_match($pat,$text)){
    //未ログイン だったら  日本語ログイン にリダイレクト
    if(!isset($this->viewVars['user'])){
	     header("Location: http://www.XXXX/users/login");
    }
}


エラーメッセージが
 http://www.XXXX/e_member_contents/index のウェブページは リダイレクトの回数が多すぎます。
となっています。


 header("Location: http://www.XXXX/mypage/members/login");

をコメントアウトするとブログが表示されます。

つまり、 /mypage/members/login でログインしているのに

if(!isset($this->viewVars['user']))

で 未ログインの判定 となり、if文の中に入る。/mypage/members/login へ戻される ということを繰り返しているようです。

/mypage/members/login でログイン済の判断は

if(!isset($this->viewVars['user']))

では間違っている ということのように思えてきました。

■ BaserCMSのバージョン:3.0.6.1→3.0.7
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ
■ 利用しているデータベース:SQLite

n1215 > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/12 18:54
Coo 様

3.0.7での変更点の1つに、複数認証プレフィックスへの対応(管理画面やその他のマイページ画面に対し別々にログイン状態を管理できるようにする)というものがありました。
この変更の副作用で、デフォルト以外のログインユーザの取得が上手くいかなくなっているようです。

この問題は根が深そうなので、現時点では、
セッションの値を直接調べて判定するのが暫定的な解決策になるのではないかと思います。


if(CakeSession('Auth.Mypage') === null && CakeSession('Auth.Front') === null){
  header("Location: http://example.comn/mypage/members/login");
  exit();
}


本来はViewでやるよりControllerのbeforeFilterあたりで処理すべきという感じではありますが。

Twitter: @n_1215

n1215 > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/13 22:30

追記です。
セッションキーを管理画面と同じ'User'に変更して共有すると3.0.6.1以前とほぼ同様にBcAuthComponentが動くようです。
もし、プレフィックスごとにログイン状態を独立して管理したいという要望がなければ、
前回の返信のように小細工をするより、セッションキーを共有にするほうが手っ取り早いと思います。

また、3.0.7リリース後にプレフィックス認証の仕組の調整が入っています。
セッションキーを共有にして上手く動かない場合はGitHubの最新版を試すという手もありかもしれません。
https://github.com/baserproject/basercms/commit/2e6467f8527c9e6aa6bac1c660580dd691febd68

Twitter: @n_1215

Coo > Re: 会員専用の日本語ページと英語ページに、同じID_PWで、ログイン画面は別 でログインしたい。 @ 2015/4/14 21:35
n1215様

いつもご回答ありがとうございます。

ログインしていれば、日本語も英語も見ることができてOKですので、
プレフィックスごとにログイン状態を独立して管理したい」という要望はありません。

メニュー「日本語 会員ブログ」をクリック ⇒ 日本語・英語 共通のログイン画面 ⇒日本語 会員ブログ
メニュー「英語 会員ブログ」をクリック ⇒ 日本語・英語 共通のログイン画面 ⇒英語 会員ブログ
と切り分けたいので「どのメニューをクリックしたか」をログイン画面で判断し、
リダイレクト先を振り分けるという方針に変更しようと思います。
※WEBシステムに慣れていないので調べながら実装を試みてみます。
ありがとうございました。

デザインが「User」「Member]で異なってしまうのも、認証プリフィックスの新機能の影響があるのでしょうかね。。。正しい状態がうまく把握できていません。。。

■ BaserCMSのバージョン:3.0.6.1→3.0.7
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用:ON
■ 設置フォルダ:サブフォルダ
■ 利用しているデータベース:SQLite

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

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

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