- ユーザーごとに一意のソルトを使用してユーザー パスワードをハッシュします。これにより、部外者がデータベースにアクセスできる場合、パスワードを解読できず、ソルトがレインボー テーブル攻撃を緩和します。
2 - 4. アクセス レベル (1: メンバー、2: モデレーター (承認)、3: 管理者) 用のテーブルを使用し、次のような多対多接続を格納するユーザー権限用にさらに別のテーブルを使用します。
id (auto_increment)|usr_id|role_id|group_id
-------------------------------------------
1 |1 |3 |-1
2 |2 |2 |1
3 |2 |3 |2
4 |3 |1 |2
あなたの場合、ユーザー 1 はサイト全体の管理者、ユーザー 2 はグループ 3 の管理者、グループ 2 のモデレーター、ユーザー 3 はグループ 2 のメンバーです。
[編集:]
さまざまな役割の権限を制限することに関するいくつかの考え: 設定によっては、ページごとにいくつかの役割の強制を使用する必要があります。たとえば、MVC フレームワークでは、基本コントローラーを拡張して、(役割) 承認機能を必要とするようにします。そうしないと、例外をスローする必要があります。ユーザーのログインを必要としないメソッド (ページ) では、ダミーの承認を使用できます。
したがって、認可クラスは次のようになります
class Authorization
{
public $authorized = false;
public function dummy()
{
$this->authorized = true;
}
public function member($usr_id, $group_id = null)
{
$sql = "SELECT usr_id FROM usr_roles WHERE usr_id = " . $usr_id . ($group_id !== null) ? " AND group_id " . $group_id : "";
// count the results of $sql query
// or some more stuff
if ($results > 1)
{
$this->authorized = true;
}
else
{
$this->authorized = false;
}
}
// the other functions
}
新しい基本コントローラー クラスは次のようになります。
class BaseController extends Controller
{
protected $authorization;
public function __construct()
{
$this->authorization = new Authorization();
}
public function render()
{
if ($this->authorization->authorized === true)
{
parent::render
}
else
{
// redirect to not authorized page
}
}
}
最後に、コントローラーは次のようになります。
class IndexController extends BaseController
{
// some stuff, methods etc.
// methods needs logged in user and user must be a member.
public function index()
{
$this->authorization->member($session_user->getId());
}
}
[EDIT2:]
OOP に慣れていない場合は、次の操作を実行できます。
ロール テーブルのサンプル レイアウトを次に示します。
role_id|role_name
-----------------
1 |member
2 |moderator
3 |admin
次に、関数 authorize() を作成して、すべてのファイルに含めることができます。
// role_name = "member", "moderator", "admin"
function authorize($usr_id = null, $role_name = null, group_id = null)
{
// test for user in group and role, return boolean
}
ファイルにこの関数を含め、次の操作を行います
if (authorize($usr_id, "moderator", 2)
{
// show stuff, if user with $usr_id is moderator for group 2
}
else
{
// do something else
}
// stuff for all