CodeGym /コース /SQL SELF /ロールの作成と管理: ROLES

ロールの作成と管理: ROLES

SQL SELF
レベル 47 , レッスン 1
使用可能

ロールは、PostgreSQLで個々のユーザーやユーザーグループを表すことができるんだ。データベース、テーブル、スキーマ、その他のオブジェクトへのアクセスを管理する役割を持ってるよ。

ロールを作成すると、デフォルトでは特定のユーザーやグループに紐づいていないけど、必要に応じてプロパティや権限を割り当てることができるよ。

ロールとユーザーの違い

じゃあユーザーはどうなの?ここで混乱しないように注意してね。PostgreSQLではユーザーもロールとみなされるけど、ちょっと違いがあるんだ。ユーザーは必ずログインできる属性を持っている。つまり、ロールはLOGIN属性があればユーザーとして扱われるよ。もしグループとして使いたい、またはログインさせたくない場合はLOGIN属性を付けなくてOK。

例:

  • LOGIN属性付きのロール = ユーザー。
  • LOGINなしのロール = グループまたは「サービスロール」。

ロールを作成する

ロールを作るにはCREATE ROLEコマンドを使うよ。シンタックスはこんな感じ:

CREATE ROLE <ロール名> [WITH] [パラメータ];

ここでパラメータは、ロールのプロパティだよ。例えば:

  • LOGIN — データベースへのログイン可。
  • CREATEDB — データベース作成可。
  • CREATEROLE — 他のロール作成可。
  • SUPERUSER — フルアクセス(超危険なので注意して使ってね)。
  • PASSWORD — 認証用パスワード。

ユーザーロールの作成例を見てみよう。
例えば、studentというユーザーをログイン権限とパスワード付きで作りたい場合は、次のクエリを実行するよ:

CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';

このコマンドでstudentという名前のロールが作成されて、データベースに接続できるようになるよ。

次に、グループロールteachersを作ってみよう。グループロールにはLOGIN属性は不要だよ。グループに入っているユーザーは自分のアカウントでログインするからね。

CREATE ROLE teachers;

ロールへの権限付与

PostgreSQLのロールは、リソースへのアクセスを許可したり制限したりするために使うよ。そのためにGRANTREVOKEコマンドを使うんだ。

GRANTで権限を与える

コマンドのシンタックス:

GRANT <権限> ON <オブジェクト> TO <ロール>;

じゃあ、coursesテーブルを作って、teachersロールにこのテーブルの読み書き権限を与えてみよう。

-- テーブルを作成
CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    teacher_id INT
);

-- アクセス権を付与
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;

これでteachersロールに入っているユーザーは、coursesテーブルのデータを閲覧・追加・編集できるようになるよ。

REVOKEで権限を取り消す

権限を取り消すにはREVOKEコマンドを使うよ。シンタックス:

REVOKE <権限> ON <オブジェクト> FROM <ロール>;

例えば、teachersグループにcoursesテーブルの更新権限を取り消したい場合は:

REVOKE UPDATE ON courses FROM teachers;

ロールの階層: 継承

ユーザーはグループロールから権限を「継承」できるよ。これで管理がすごく楽になるんだ。まるで「遺産」を他のユーザーに渡す感じだね。

INHERITキーワードを使うと、ロールは他のロールから権限を継承できるよ。これはデフォルトで有効だけど、変更もできる。

例:

-- ユーザー`john`をグループ`teachers`に追加
GRANT teachers TO john;

これでjohnユーザーは自動的にteachersグループロールの権限を全部もらえるよ。

権限を確認してみよう:

\du john

もし継承を無効にしたい場合は、ロール作成時にNOINHERIT属性を付けるよ。

CREATE ROLE admin NOINHERIT;

これでadminロールのユーザーは、デフォルトではその権限を使えなくなるよ。

アクセス管理のためのロールグループ作成

ロールグループを使うと、特に大きなプロジェクトでアクセス管理がめっちゃ楽になるよ。ユーザーごとに権限を付ける代わりに、グループにユーザーを追加して、グループに必要な権限を与えればOK!

簡単なグループロールの例を紹介するね。グループを作るには:

  • students — 学生用グループ。
  • teachers — 教師用グループ。
CREATE ROLE students;
CREATE ROLE teachers;

ユーザーをグループに割り当てよう:

-- ユーザーjohnをstudentsグループに追加
GRANT students TO john;

-- ユーザーjaneをteachersグループに追加
GRANT teachers TO jane;

これで、studentsteachersグループにテーブルへのアクセス権を与えれば、そのグループの全員が自動的にアクセスできるようになるよ!

実践課題

  1. examsテーブルを次のカラムで作成しよう:
    • id: 主キー;
    • subject: テキスト;
    • teacher_id: 教師のID。
CREATE TABLE exams (
    id SERIAL PRIMARY KEY,
    subject TEXT NOT NULL,
    teacher_id INT
);
  1. ロールグループstudentsteachersを作成しよう。
CREATE ROLE students;
CREATE ROLE teachers;
  1. teachersグループにexamsテーブルの追加・編集権限を与えよう。
GRANT INSERT, UPDATE ON exams TO teachers;
  1. studentsグループには読み取り専用権限だけを与えよう。
GRANT SELECT ON exams TO students;
  1. aliceユーザーを作成して、studentsグループに追加しよう。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
  1. aliceでログインして、どんな権限があるか確認してみよう。

これでロールの作成、権限管理、グループロールでの管理ができるようになったね!次のレクチャーでは、GRANTREVOKEコマンドを使って、データベース、スキーマ、テーブル単位でより細かいアクセス制御を設定する方法を解説するよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION