Go 言語と MySQL データベース: データの役割の権限をどのように分割するか?

王林
リリース: 2023-06-17 13:52:45
オリジナル
1752 人が閲覧しました

インターネットの発展と普及に伴い、データのセキュリティと権利管理は企業や個人が直面しなければならない重要な課題となっています。データベースは、企業で最も一般的に使用されるデータの保存および管理ツールの 1 つであり、データの役割権限の分割は、データベースのセキュリティと権限管理の重要な手段です。この記事では、Go 言語と MySQL データベースを組み合わせてデータの役割の権限を分割する方法を紹介します。

1. データの役割の権限はどのように分割されますか?

データ ロール権限の分割とは、さまざまなユーザーを機能やアイデンティティに応じて異なるロールに分割し、これらのロールに特定の操作権限を割り当てることを指します。たとえば、企業のシステム管理者はデータベースを完全に制御できますが、一般の従業員は単純なクエリと変更操作のみを実行できるため、さまざまなユーザーに役割を分割し、権限を割り当てる必要があります。データの役割権限を分割することは、データのセキュリティを確保するだけでなく、作業効率やデータ利用効果の向上にもつながるため、企業では必須の業務となっています。

2. Go 言語を使用して MySQL データベースに接続する

Go 言語はシンプルで効率的なプログラミング言語であり、その標準ライブラリには MySQL のサポートが組み込まれており、追加の依存関係を使用せずに使用できます。状況に応じて MySQL データベース操作を実行します。

Go 言語を使用して MySQL データベースに接続する手順は次のとおりです。

  1. MySQL ドライバーをインストールします

Go 言語では、次のものが必要です。一般的に使用されるドライバーには、go-sql-driver と mysql-go-driver があります。

go-sql-driver を例に挙げると、次のコマンドを使用してインストールできます:

go get github.com/go-sql-driver/mysql
ログイン後にコピー
  1. MySQL データベースに接続

Before MySQL データベースに接続するには、まずデータベース アドレス、ポート、ユーザー名、パスワード、データベース名などのデータベース接続情報を構成する必要があります。 Go 言語では、次のコードを使用して MySQL データベースに接続できます:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "用户名:密码@tcp(数据库地址:端口号)/数据库名称")
    if err != nil {
        //连接失败处理
        return
    }
    defer db.Close()
}
ログイン後にコピー

上記のコードは、sql.Open 関数を使用してデータベースに接続します。この関数は 2 つのパラメータを受け入れます。最初のパラメータはMySQL ドライバー名 ("mysql") の 2 番目のパラメーターは接続文字列 ("ユーザー名:パスワード@tcp(データベース アドレス:ポート番号)/データベース名") です。接続構成が完了したら、プログラムの終了後にデータベース接続を閉じる必要があります。

  1. SQL ステートメントの実行

接続が成功したら、Go 言語を使用して SQL ステートメントを実行し、MySQL データベースを操作できます。たとえば、MySQL データベース内のデータをクエリするには、次のコードを使用できます:

rows, err := db.Query("SELECT * FROM 表名")
if err != nil {
    //查询失败处理
    return
}
defer rows.Close()
for rows.Next() {
    var id int
    var name string
    var age int
    err := rows.Scan(&id, &name, &age)
    if err != nil {
        //数据读取失败处理
        continue
    }
    //数据处理
}
ログイン後にコピー

上記のコードは、db.Query 関数を使用して SQL クエリ ステートメントを実行し、結果セットを返します。Query 関数は、 1 つのパラメーター。これは実行される SQL ステートメントです。クエリ結果セットは 1 つずつ読み取る必要があり、これは rows.Next 関数と rows.Scan 関数を使用して実現できます。 Scan 関数のパラメータは、結果セット内の各フィールド値へのポインタです。データを読み取るときは、フィールドの種類と順序に注意する必要があります。クエリが完了したら、結果セットを閉じる必要があります。

3. データ ロール権限分割の実装

Go 言語と MySQL データベースを使用してデータ ロール権限分割を実装する手順は次のとおりです:

  1. ユーザー ロールの作成table

まず、ユーザーとロールの情報を保存するユーザー ロール テーブルを作成する必要があります。ユーザー ロール テーブルの構造は次のとおりです。

CREATE TABLE user_role (
    user_id INT NOT NULL,
    role_id INT NOT NULL,
    PRIMARY KEY (user_id, role_id)
);
ログイン後にコピー

上記のコードは、user_role という名前のテーブルを作成します。このテーブルには、ユーザー ID とロール ID を表す user_id と role_id の 2 つのフィールドが含まれます。ユーザーは複数のロールを持つ可能性があるため、user_role テーブルには (user_id, role_id) を複合主キーとして使用する多対多の関係が存在します。

  1. ロール権限テーブルの作成

次に、ロールと権限の情報を保存するロール権限テーブルを作成する必要があります。ロール権限テーブルの構造は次のとおりです。

CREATE TABLE role_permission (
    role_id INT NOT NULL,
    permission_id INT NOT NULL,
    PRIMARY KEY (role_id, permission_id)
);
ログイン後にコピー

上記のコードは、ロール ID と権限 ID を表す、role_id と Permission_id の 2 つのフィールドを含む、role_permission という名前のテーブルを作成します。また、(role_id、permission_id) を複合主キーとして使用します。

  1. ユーザーの役割と権限の割り当て

ユーザーが個人情報を登録または変更するとき、プログラムはユーザー ID と役割 ID の情報を user_role テーブルに保存する必要があります (サンプル)コードは次のとおりです。

func assignRole(user_id, role_id int) error {
    db, err := sql.Open("mysql", "用户名:密码@tcp(数据库地址:端口号)/数据库名称")
    if err != nil {
        return err
    }
    defer db.Close()
    //插入用户角色信息
    _, err = db.Exec("INSERT INTO user_role (user_id, role_id) VALUES (?, ?)", user_id, role_id)
    if err != nil {
        return err
    }
    return nil
}
ログイン後にコピー

上記のコードは、db.Exec 関数を使用して SQL 挿入ステートメントを実行し、ユーザーとロール間の対応する関係を挿入します。同様に、db.Exec 関数を使用して、ロールと権限の間の対応する関係を role_permission テーブルに保存することもできます。

  1. ユーザー権限の確認

ユーザーが操作を実行するときは、ユーザーの役割と権限情報を確認する必要があります。たとえば、管理者ロールを持つユーザーはユーザー情報を削除できますが、一般ユーザーはユーザー情報の参照のみが可能です。この機能を実現するには、プログラム内でロールと権限の情報を使用してデータベースにクエリを実行し、対応するユーザーが操作するための十分な権限を持っているかどうかを判断する必要があります。サンプル コードは次のとおりです。

func checkPermission(user_id, permission_id int) (bool, error) {
    db, err := sql.Open("mysql", "用户名:密码@tcp(数据库地址:端口号)/数据库名称")
    if err != nil {
        return false, err
    }
    defer db.Close()
    //查询用户角色
    rows, err := db.Query("SELECT role_id FROM user_role WHERE user_id=?", user_id)
    if err != nil {
        return false, err
    }
    defer rows.Close()
    role_ids := []int{}
    for rows.Next() {
        var role_id int
        err := rows.Scan(&role_id)
        if err != nil {
            return false, err
        }
        role_ids = append(role_ids, role_id)
    }
    //查询角色权限
    for _, role_id := range role_ids {
        rows, err := db.Query("SELECT COUNT(*) FROM role_permission WHERE role_id=? AND permission_id=?", role_id, permission_id)
        if err != nil {
            return false, err
        }
        defer rows.Close()
        count := 0
        for rows.Next() {
            err := rows.Scan(&count)
            if err != nil {
                return false, err
            }
        }
        //判断是否有权限
        if count > 0 {
            return true, nil
        }
    }
    return false, nil
}
ログイン後にコピー

上記のコードは、user_role テーブルをクエリしてユーザーが属するロール情報を取得し、次に role_permission テーブルをクエリしてロールが所有する権限情報を取得し、最後にユーザーが対応する操作権限を持っているかどうか。ユーザーが権限を持っている場合は true を返し、権限を持っていない場合は false を返します。

4. 概要

Go 言語と MySQL データベースを組み合わせることで、データの役割権限の分割が実現され、データの安全性と管理の効率が向上します。実際の開発では、権限制御やデータ管理の効果を最大限に発揮するために、さまざまなビジネスシナリオやプログラム要件に応じて、ユーザーの役割や権限情報を柔軟に設定する必要があります。

以上がGo 言語と MySQL データベース: データの役割の権限をどのように分割するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート