ホームページ  >  記事  >  バックエンド開発  >  PHP7.0で階層型権限制御を実装するにはどうすればよいですか?

PHP7.0で階層型権限制御を実装するにはどうすればよいですか?

PHPz
PHPzオリジナル
2023-05-26 10:51:061258ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。