Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#26 2006-02-26 18:47:51

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

「ログイン・ユーザーに限定とチーム・メンバーに限定」
ソース確認と動作させてみて、これの意味がやっと分かりました。イコールこういうことですね。

ログイン・ユーザーに限定 = ログインメンバーに限定
チーム・メンバーに限定 = チームに属するログインメンバーに限定


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#27 2006-02-26 21:35:48

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_AccessControl

はい,そういうことです。
Basic認証を使うプラグインはNP_BasicAuthという名前でどこかに挙げたような。

オフライン

#28 2006-02-26 22:24:12

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

ありがとうございます。NP_BasicAuth、本国サイトで見つけてきました。
これはNP_AccessControlのベースとなったものと考えたのですが、そもそもNP_AccessControlにはRSSファイルに対してBasic認証でアクセス制限を行っているので、RSS用のソース部分を以下のように「case 'BASIC認証' :」みたいにすれば、一般閲覧者向け BASIC認証によるアクセス制限が行えるのではないかと思いソースを眺めているのですが・・・そのような方向で考えて間違いないでしょうか?。

case 'nothing' :
  return TRUE;
case 'BASIC認証' : //追加
一般閲覧者向け BASIC認証用のソース;//追加
  break;//追加
case 'needlogin' :
  if ($member->isLoggedIn()) return TRUE;
  break;
case 'memberonly' :
  if ($member->isLoggedIn() && $member->isTeamMember($blogid)) return TRUE;
  break;

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#29 2006-02-26 22:36:35

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_AccessControl

Z10 さんの発言:

ありがとうございます。NP_BasicAuth、本国サイトで見つけてきました。
これはNP_AccessControlのベースとなったものと考えたのですが、そもそもNP_AccessControlにはRSSファイルに対してBasic認証でアクセス制限を行っているので、RSS用のソース部分を以下のように「case 'BASIC認証' :」みたいにすれば、一般閲覧者向け BASIC認証によるアクセス制限が行えるのではないかと思いソースを眺めているのですが・・・そのような方向で考えて間違いないでしょうか?。

可能だと思います。

オフライン

#30 2006-02-27 10:19:22

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

RSSに対するBASIC認証の部分やNP_BasicAuthのコードを参考に、optionを追加したりして、以下のようにswitch部分を以下のようにしてみたのですが、あっけなく素通りしてしまいます。むずかしい。

define('_ACCSSCNTRL_OPTION_BASICONLY',		'BASIC認証・ユーザーに限定');
define('_ACCSSCNTRL_OPTION_BASICUSER',		'BASIC認証用ユーザー名');
define('_ACCSSCNTRL_OPTION_BASICPASS',		'BASIC認証用パスワード');
$this->createBlogOption('username', _ACCSSCNTRL_OPTION_BASICUSER,'text','');
		$this->createBlogOption('password', _ACCSSCNTRL_OPTION_BASICPASS,'password','');
		$this->createOption('defaultname', 'Default User Name', 'text', 'user');
		$this->createOption('defaultpass', 'Default Password', 'password', 'pass');
switch ($this->getBlogOption($blogid, 'login_needed')) {
			case 'nothing' :
				return TRUE;


			case 'basic' :
				if (!($user = $this->getBlogOption($blogid, 'username'))) {
				$user = $this->getOption('defaultname');
				}
				if (!($pass = $this->getBlogOption($blogid, 'password'))) {
				$pass = $this->getOption('defaultpass');
				}
				$iteration = $this->getBlogOption($blogid, 'login_iteration');
				while ($iteration-- && (($_SERVER['PHP_AUTH_USER'] != $user) || ($_SERVER['PHP_AUTH_PW'] != $pass))) {
				         header('WWW-Authenticate: Basic realm="auth"');
				         header('HTTP/1.0 401 Unauthorized');
				         echo "To view, you need correct ID/Password\n";
				         exit;
				      }
				if (!$iteration) return FALSE;
				return TRUE;
				break;

			case 'needlogin' :
				if ($member->isLoggedIn()) return TRUE;
				break;
			case 'memberonly' :
				if ($member->isLoggedIn() && $member->isTeamMember($blogid)) return TRUE;
				break;
		}

switchへの追加をやめて以下のようにしてみたけれども、これも素通り。なにか根本をいじらないといけない気がしますが、そこがわからない。むぅ。

if ($this->getBlogOption($blogid, 'login_needed') == 'basic') {
				if (!($user = $this->getBlogOption($blogid, 'username'))) {
				$user = $this->getOption('defaultname');
				}
				if (!($pass = $this->getBlogOption($blogid, 'password'))) {
				$pass = $this->getOption('defaultpass');
				}

				$iteration = $this->getBlogOption($blogid, 'login_iteration');
				while ($iteration-- && (($_SERVER['PHP_AUTH_USER'] != $user) || ($_SERVER['PHP_AUTH_PW'] != $pass))) {
					header('WWW-Authenticate: Basic realm="Authentication"');
					header('HTTP/1.0 401 Unauthorized');
					echo _ACCSSCNTRL_CONTENTS_PROHIBIT;
					exit;
				}
				if (!$iteration) return FALSE;
				return TRUE;
			
		}

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#31 2006-02-27 11:19:23

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

Nucleus管理にログインしているブラウザからは素通りでしたが、別のブラウザをたちあげアクセスしてみたらBASIC認証動作が行えました。ん?
switchに追加タイプでも動作確認できました。あれ?
NP_BasicAuthも一緒に同じID/PASSだったので、素通りしたと思っていたのは、単に既に認証を済ませてしまっていただけの話でした。

とりあえず、BASIC認証によるブログへのアクセス制限はできたよう(?)なので、これを外部のhtpasswordを参照させ認証を行いたいです。できるかなぁ、私に。


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#32 2006-02-27 12:04:41

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

あぁ、testitemcommentのswitchもあった。上記のコードだけでは中途半端なのかも・・・、その判断がつきません。
function testitemcommentのswitch部分の修正すべき方向がわからず・・・。


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#33 2006-02-27 12:07:22

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_AccessControl

完成したら新バージョンに取り込みますので,がんばってください。 big_smile

オフライン

#34 2006-02-27 14:33:46

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

$lines = file("/home/******/php/nucleus/nucleus/pass.txt");
 for ($i=0; $i<count($lines); $i++) {
  list($user, $pass) = explode(":", $lines[$i]);
 }

うむぅ〜、なんかこんなことやればいけてしまうのではないかと思うのですが、php道は険しい・・。


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#35 2006-02-27 16:01:24

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

こんなことしてみるも、延々ID/PASSを要求される始末・・・。

case 'externalbasic' :

				//$passwordfile = $this->getOption('passwordfile');
				//$lines = file("$passwordfile");
				$lines = file("/home/*****/php/nucleus/nucleus/pass.txt");
				

				for ($i=0; $i<count($lines); $i++) {
				    list($user, $pass) = explode(":", $lines[$i]);
				
				}

				$iteration = $this->getBlogOption($blogid, 'login_iteration');
				while ($iteration-- && (($_SERVER['PHP_AUTH_USER'] != $user) || ($_SERVER['PHP_AUTH_PW'] != $pass))) {
				         header('WWW-Authenticate: Basic realm="Authentication"');
				         header('HTTP/1.0 401 Unauthorized');
				         echo "To view, you need correct ID/Password\n";
				         exit;
				      }
				if (!$iteration) return FALSE;
				return TRUE;
				
				break;

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#36 2006-02-27 18:24:20

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

				for ($i=0; $i<count($lines); $i++) {
				    list($user, $pass) = explode(":", $lines[$i]);
				}

これだと$userと$passは毎回最終行に更新されてしまいますね。
$linesでforeachしてすべての行をスキャンしたほうがよさそうです。
たとえば

foreach ($lines as $line ) {
 list($user, $pass) = explode(":", $line);
 //検証処理
}

検証処理は同じロジックならクラス化するとよいかもです。
普通、.htpasswdはcryptですよね。nucleusはmd5。
検証用データ登録時にplainでもmd5でもcryptでも決めておけばいいわけですが、一般の.htaccessと互換性をとるならcryptで行った方がよいかもしれませんね。

オフライン

#37 2006-02-27 18:49:32

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

kosugiatkipsさん、ありがとうございます。
以下のようにしてみましたが、ID/PASSが通らない・・・。
Z10のphpインチキカスタマイズショー、頭打ちです(':(')。

case 'externalbasic' :

		//$passwordfile = $this->getOption('passwordfile');
		//$lines = file("$passwordfile");
		$lines = file("/home/*****/php/nucleus/nucleus/pass.txt");
				

				
		foreach ($lines as $line ){
		 list($user, $pass) = explode(":", $line[$i]);

		$iteration = $this->getBlogOption($blogid, 'login_iteration');
		while ($iteration-- && (($_SERVER['PHP_AUTH_USER'] != $user) || ($_SERVER['PHP_AUTH_PW'] != $pass))) {
		header('WWW-Authenticate: Basic realm="Authentication"');
		 header('HTTP/1.0 401 Unauthorized');
		 echo "To view, you need correct ID/Password\n";
		 exit;
		}
		if (!$iteration) return FALSE;
		return TRUE;
		break;

		 }

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#38 2006-02-27 19:11:11

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

すみません。結構編集したかも。

function basicFileAuth($file) {
	$lines = file($file);
	if (!$lines) exit("AUTH FILE NOT FOUND");
	foreach ($lines as $line ){
		list($user, $pass) = explode(":", $line);
		if (($_SERVER['PHP_AUTH_USER'] != $user) || ($_SERVER['PHP_AUTH_PW'] != $pass)) {
			continue;
		} else {
			return true;
		}
	}
	return false;
}

こんな感じのfunctionを作っておいて、下記のようにしたらいいと思いますが、本物の.htpasswdで使うならsubstrしてcryptで比較する必要があると思います。

      $iteration = $this->getBlogOption($blogid, 'login_iteration');
      while ($iteration-- && !$this->basicFileAuth("/hogehoge/hoge/plaintext.txt")) {
      header('WWW-Authenticate: Basic realm="Authentication"');
       header('HTTP/1.0 401 Unauthorized');
       echo "To view, you need correct ID/Password\n";
       exit;
      }
      if (!$iteration) return FALSE;
      return TRUE;
      break;

てな感じでどうでしょうか。

検証してないので、ぼけぼけだったらすんませんです。

オフライン

#39 2006-02-27 19:45:58

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

やってみました。
見た目素通りしているように見えるのは認証がすんでしまっているからなのかな・・・。

http://type-z10.com
MEMBER

id/pass = username/password


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#40 2006-02-27 19:51:35

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: NP_AccessControl

素通りします roll

オフライン

#41 2006-02-27 19:56:14

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

Andyさん、テストありがとうございます。

kosugiatkips さんの発言:

本物の.htpasswdで使うならsubstrしてcryptで比較する必要があると思います。

用意しているpass.txtは「username:yCDP4k4KGIK1o」とcryptされた正式なものです。だからかな。

と思ったのですが、noncryptのファイルに対しても素通りしてしまう・・・ような。
現在、noncriptのpass.txtを設定中


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#42 2006-02-27 20:28:05

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

実は、なんどかコードを更新していまして・・・すみません。

最後のコードならうちの環境では正しく動作しました。
公開できるテスト環境がないので、なんとも言えないのですが。。

オフライン

#43 2006-02-27 20:41:48

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

function basicFileAuth()はこの位置に入れました。

〜(略)〜
			_ACCSSCNTRL_OPTION_MEMBERONLY . '|memberonly');
		}
	}

	//cript
	function basicFileAuth($file) {
	   $lines = file($file);
	   if (!$lines) exit("AUTH FILE NOT FOUND");
	   foreach ($lines as $line ){
	      list($user, $pass) = explode(":", $line);
		  $CryptPW = crypt($_SERVER['PHP_AUTH_PW'],substr(trim($pass),0,2));
	      if (($_SERVER['PHP_AUTH_USER'] != trim($user)) || ($CryptPW != trim($pass))) {
 	        continue;
 	     } else {
	         return true;
	      }
	   }
	   return false;
	}
		
	function testlogin($data) {
〜(略)〜
case 'externalbasic' :

//$passwordfile = $this->getOption('passwordfile');
//$lines = file("$passwordfile");
//$lines = file("/home/*****/php/nucleus/nucleus/pass.txt");
				
$iteration = $this->getBlogOption($blogid, 'login_iteration');
while ($iteration-- && !$this->basicFileAuth("/home/*****/php/nucleus/nucleus/criptpass.txt")) {
header('WWW-Authenticate: Basic realm="Authentication"');
header('HTTP/1.0 401 Unauthorized');
echo "To view, you need correct ID/Password\n";
exit;
}
if (!$iteration) return FALSE;
return TRUE;
break;

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#44 2006-02-27 20:42:24

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

cryptしている場合はこんな感じになりますかな。少し修正。

	function basicFileAuth($file) {
   $lines = file($file);
   if (!$lines) exit("AUTH FILE NOT FOUND");
   
   foreach ($lines as $line ){
      list($user, $pass) = explode(":", $line);
	  $CryptPW = crypt($_SERVER['PHP_AUTH_PW'],substr(trim($pass),0,2));
      if (($_SERVER['PHP_AUTH_USER'] != trim($user)) || ($CryptPW != trim($pass))) {
         continue;
      } else {
         return true;
      }
   }
   return false;
}

で検証は

$iteration = $this->getBlogOption($blogid, 'login_iteration');
while ($iteration-- && !$this->basicFileAuth("ファイルへのサーバ上のパス")) {
	header('WWW-Authenticate: Basic realm="Authentication"');
	header('HTTP/1.0 401 Unauthorized');
	echo "To view, you need correct ID/Password\n";
	exit;
}
if (!$iteration) return FALSE;
return TRUE;
break;

オフライン

#45 2006-02-27 20:56:24

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

kosugiatkipsさん、ありがとうございます。
でも、あれ?、ん〜、なんで?

現在、criptファイル設定中。


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#46 2006-02-27 20:57:06

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

while ($iteration-- && $this->basicFileAuth("/home/******/hogehoge.txtt")) {

  私の最初のコードで間違ってたのはここで↑
  正しくは↓
while ($iteration-- && !$this->basicFileAuth("/home/******/hogehoge.txtt")) {

判定のところで、!を入れてください。
執行猶予が残っていて、検証に失敗していたらという条件なので、検証の成功時にtrueを返すbasicFileAuthに!をつけるのが正解でした。

あと、ファイルへの記述で\nとか\0とか混ざっていると判定にミスるのでtrimを入れてみました。

オフライン

#47 2006-02-27 21:02:36

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

kosugiatkips さんの発言:

while ($iteration-- && !$this->basicFileAuth("/home/******/hogehoge.txtt")) {

判定のところで、!を入れてください。

うまくいきましたー!(涙)


Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#48 2006-02-27 21:14:20

Z10
メンバー
From: 神奈川
登録日: 2005-06-30
投稿: 228

Re: NP_AccessControl

プラグインオプションでパスワードファイルを設定するようにしてみました。

$this->createOption('passwordfile', 'Path to Password File', 'text', '/home/yoursitepathto/pass.txt');
case 'externalbasic' :

		$passwordfile = $this->getOption('passwordfile');
				
		$iteration = $this->getBlogOption($blogid, 'login_iteration');
		while ($iteration-- && !$this->basicFileAuth("$passwordfile")) {
		header('WWW-Authenticate: Basic realm="Authentication"');
		header('HTTP/1.0 401 Unauthorized');
		echo "To view, you need correct ID/Password\n";
		exit;
		}
		if (!$iteration) return FALSE;
		return TRUE;
		break;

Kilax.org
http://kilax.org
Kilax : Nucleus HTML5 w/Responsive Skin
http://kilax.org/blog/catid_2-itemid_3.html

オフライン

#49 2006-02-28 08:58:53

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

function basicFileAuthについては動作確認でしかないためfunctionの中からグローバル変数を直接呼び出していてスマートではないので、クラスプロパティに指定するなどして適当に書き換えてくださいませ。
関数名もちょっとおかしいような・・・。

オフライン

#50 2006-04-16 21:03:07

kosugiatkips
メンバー
From: 金沢区
登録日: 2006-01-15
投稿: 353

Re: NP_AccessControl

V1.2でブログオプションでスキンタイプ制限を加えると、制限リストに入っているスキン名でもfalseになってしまったのでなんでかなと思って確認したのですが、

135行目
return (strpos(','.$allowedskins.',' , ','.$currentSkinName.',') === TRUE);

179行目
return (strpos(','.$allowedskins.',' , ','.$skinname.',') === TRUE);

この2行がうまく動作していないようです。
PHPのバージョンとかの問題でしょうか。原因はよくわかりません。

if (strpos($allowedskins , $currentSkinName)) return TRUE;
return false;
こんな感じにしたら、目的の動作はしました。カンマなしにしたので、スキン名 とスキン名2などの区別がつかなくなるという問題はまぁ、自分のサイトなのでよしとしましたが、explodeしてarray_search の方がよかったかもしれません。

オフライン

Board footer