ロールは、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のロールは、リソースへのアクセスを許可したり制限したりするために使うよ。そのためにGRANTとREVOKEコマンドを使うんだ。
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;
これで、studentsやteachersグループにテーブルへのアクセス権を与えれば、そのグループの全員が自動的にアクセスできるようになるよ!
実践課題
examsテーブルを次のカラムで作成しよう:id: 主キー;subject: テキスト;teacher_id: 教師のID。
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- ロールグループ
studentsとteachersを作成しよう。
CREATE ROLE students;
CREATE ROLE teachers;
teachersグループにexamsテーブルの追加・編集権限を与えよう。
GRANT INSERT, UPDATE ON exams TO teachers;
studentsグループには読み取り専用権限だけを与えよう。
GRANT SELECT ON exams TO students;
aliceユーザーを作成して、studentsグループに追加しよう。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
aliceでログインして、どんな権限があるか確認してみよう。
これでロールの作成、権限管理、グループロールでの管理ができるようになったね!次のレクチャーでは、GRANTとREVOKEコマンドを使って、データベース、スキーマ、テーブル単位でより細かいアクセス制御を設定する方法を解説するよ。
GO TO FULL VERSION