Web アプリケーションを開発する場合、多くの場合、ユーザーの役割と権限に基づいてシステム内でのユーザーのアクセスを制限する必要があります。階層型権限制御は一般的な権限管理方法であり、役割と権限に基づいてユーザーを異なるグループに分割し、各グループは異なるコンテンツにアクセスできます。 PHP7.0 では、Session や MySQL などのテクノロジーを使用して、階層的な権限制御を実装できます。
1. データベースの設計
データベースには、通常、ユーザー テーブル、ロール テーブル、権限テーブルの 3 つのテーブルを作成する必要があります。 3 つのテーブルの構造設計は次のとおりです。
(1) ユーザー テーブル
CREATE TABLE users
(
`id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `password` VARCHAR(255) NOT NULL, `email` VARCHAR(100), `role_id` INT(11) NOT NULL, PRIMARY KEY (`id`)
);
(2) ロールテーブル
CREATE TABLE roles
(
`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`)
);
(3) 権限テーブル
CREATE TABLE permissions
(
`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `slug` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`)
);
ここでは 3 つのテーブルを使用します。そのうちのユーザー テーブルとロール テーブルはデータの一貫性を確保するために外部キーを使用します。
2. 権限制御の実装
(1) ログイン
ログイン時にはユーザー名とパスワードの認証が必要となり、ユーザー情報はセッション。以下は PHP コードの一部です:
session_start();
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $sql); if(mysqli_num_rows($result) > 0) { $row = mysqli_fetch_assoc($result); $_SESSION['user_id'] = $row['id']; $_SESSION['user_role_id'] = $row['role_id']; header("Location: dashboard.php"); exit; } else { $error = "Invalid email or password"; }
}
at ログインに成功すると、ユーザーの ID とロール ID がセッションに保存され、次回以降のアクセス時に判断されます。
(2) 権限チェック
権限チェックが必要なページでは、まずユーザーがログインしているかどうかを判断し、ユーザーのロールIDを取得する必要があります。次に、データベースからロールの権限を読み取り、判断します。ユーザーにアクセス権があるかどうかを確認するための PHP コードは次のとおりです:
session_start();
if(!isset($_SESSION['user_id'])) {
header("Location: login.php"); exit;
}
$role_id = $_SESSION['user_role_id'];
$is_allowed = false;
$sql = "SELECT 権限.slug FROM 権限 WHERE 権限.id =
(SELECT role_permission.permission_id FROM role_permission WHERE role_permission.role_id = '$role_id')";
$result = mysqli_query($conn, $sql);
$permissions = array ();
while($row = mysqli_fetch_assoc($result)) {
$permissions[] = $row['slug'];
}
if(in_array('view_dashboard', $permissions)) {
$is_allowed = true;
}
if(!$is_allowed) {
header("Location: unauthorized.php"); exit;
}
ここでは、サブクエリを使用してロール ID の権限を取得します。次に、IN キーワードと配列を使用して、ロールにアクセス権があるかどうかを判断します。
(3) アクセスの制御
上記の権限チェックにより、ユーザーにアクセス権限があるかどうかが判断できますが、権限がない場合は、ユーザーのアクセスをブロックする必要があります。実装方法は以下の通りです:
(1) アクセス制御が必要なページで、上記の権限チェックコードを先頭に配置し、アクセス権限のないユーザーの場合は、権限のないページに直接ジャンプします。ページ。
(2) ユーザーにアクセス権がある場合は、ページのコードの実行を続けます。
(3) アクセスする必要がある各リンクとボタンでは、リンクまたはボタンの権限スラッグをパラメータとして渡す必要があります。例:
ここで、ユーザーに add_news の権限がない場合、リンクは非表示になります。
3. 概要
階層型権限制御は、ユーザーの役割と権限に基づいてシステムへのユーザーのアクセスを制限できる一般的な権限管理方法です。 PHP7.0 では、Session や MySQL などのテクノロジーを使用して、階層的な権限制御を実装できます。上記の実装方法により、Web アプリケーションに階層的な権限制御を実装し、システムのセキュリティと安定性を確保できます。
以上がPHP7.0で階層型権限制御を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。