個人のCMSに取り組んでいますが、問題が発生しています。CAN_DELETE_THREAD、CAN_EDIT_MESSAGE、CAN_CREATE_THREADなどのアクセスレベルをバイナリフラグとして定義したかったのですが、関数「has_flag」がどのように機能するかわかりません。たとえば、データベースからユーザーを取得し、そのユーザーがメッセージを編集できるかどうかを確認したい場合、どうすればそれを回避できますか?
ありがとう!
permissions
データベーステーブルと、アクセス許可をユーザーに結合するテーブルを作成しpermissions_users
、ログインしたユーザーがそのページを表示できるかどうかをページごとに確認できます。
モデルがUser
あり、IDが1のパーミッションがあるとします。
if ($user->hasPermission(1)) {
// show form or whatever
}
else {
throw new ForbiddenException();
}
あなたのhasPermission()
方法は次のように単純かもしれません:
<?php
class User extends Model {
public function hasPermission($permission_id) {
$sql = "SELECT COUNT(*) FROM `permissions_users` WHERE `user_id` = :user_id AND `permission_id` = :permission_id";
$stmt = $this->pdo->prepare($sql);
$stmt->bindParam(':user_id', $this->id, PDO::PARAM_INT);
$stmt->bindParam(':permission_id', $permission_id, PDO::PARAM_INT);
return ($this->pdo->fetchColumn() > 0); // returns true if at least 1 result
}
}
もちろん、アプリケーションに合わせてこれを調整する必要があります。
ユーザーごとまたは役割ごとのアクセス設定が必要ですか?
特にシステムが多くのユーザーに対して開かれている場合は、ロールごとの方がはるかにスケーラブルです。
最初に、ユーザーが実行できるアクションをいくつかのカテゴリ ([追加、編集、削除、フラグ、アーカイブ、何でも] を含む「スレッド」) でグループ化して定義し、次に、各ロールに対して定義するリストを作成し、許可または拒否された場合の各アクション。
デフォルト値を定義すると、そのテーブルで必要な仕様の量を減らすことができます (拒否されなければすべてが許可されます。またはその逆も同様です)。
さらなる助けを得るには、もう少し詳細が必要です;)
いくつかの方法でそれを行うことができます。ユーザーに関連付けられた整数プロパティを保存してから、フラグを 2 の整数乗として定義できます。
define('CAN_CREATE_THREAD', 0x0010);
define('CAN_DELETE_THREAD', 0x0020);
次に、あなたのhasFlag($flag)
ようなものになる可能性があります
return ($this->BinaryFlags & $flag);
それ以外の場合は、すべてのフラグをデータベースに保存できます。
CREATE TABLE flags
(
id integer not null primary key auto_increment,
name varchar(32)
);
CREATE TABLE has_flag
(
user_id integer,
flag_id integer
);
hasFlag 関数はデータベースへのクエリです。
ロール レベルのアクセスは同じですが、フラグをユーザーに関連付けて保存するのではなく、ユーザーをロールに関連付け(したがって、 のようなテーブルが作成されます(user_id, role_id)
)、次に上記のようにフラグをロールに関連付けます。
利点は、すべての権限を 1 つずつ覚えて設定する必要なく、人を「セクション XYZ 管理者」として定義できることです。欠点は、最初に役割を作成しない限り、中間状態 (たとえば、編集はできるが作成はできない準管理者) を設定できないことです。