エンティティ ユーザーと権限を使用してデータベースを構築しました
ユーザー (id、電子メール、パスワード、権限) 権限 (id、create_user、delete_user、user_fk)
create_user と delete_user は BOOLEAN です。
関係: ワンワン
これで、すべてのユーザーが独自の権限を持つことができます。
私の質問は: shiro を使用してデータベースからアクセス許可を読み取るにはどうすればよいですか?
本当にユーザー レベルでのみアクセス許可を割り当てたい場合は、ロール テーブルを "偽造" して Shiro を満足させることができます。
Wouter が述べたように、 を使用してJdbcRealm
、テーブルのセットアップに 3 つのクエリを指定します。この構造を持つように許可テーブルを変更する必要があります。
permission (id, permissionname, user_fk)
次に、必要に応じて create_user/delete_user 権限の行を挿入します。このようにして、db スキーマを変更する必要なく、セットアップに別の権限 (reset_password など) を簡単に追加できます。
shiro.ini (または shiro 構成ファイルの呼び出し方法) で:
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
クエリの場合、次を使用します。
jdbcRealm.authenticationQuery = select password from user where email=?
jdbcRealm.userRolesQuery = select id from user where email=?
jdbcRealm.authenticationQuery = select permissionname from permission where user_fk=?
セットアップの小さなトリックは、役割がまったくないため、ユーザーの ID を役割名として返すだけです。パーミッション テーブルのルックアップが完了すると、ロール名 (=user pk) が使用され、関連付けられたパーミッションが返されます。
.ini ファイルで JdbcReam を構成する必要があります。
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
shiro クエリに準拠するようにスキーマを変更する場合、追加の構成は必要ありません。テーブル users、user_roles、roles_permissions が必要です。
ソースコードを参照して、正確な列名がどうあるべきかを確認してください。
または、次のように、.ini ファイル内のスキーマに一致するように独自のクエリを構成することもできます。
jdbcRealm.authenticationQuery=<your password select statement>
jdbcRealm.userRolesQuery=<your role names for username select statement>
jdbcRealm.authenticationQuery=<your permissions for role name select statement>