この投稿で説明されているように、アクセス許可ベースのアクセス制御を実装したいと考えています。
私は実装に精通していません-これを最初から最後まで実装する方法に関する詳細な例はありますか?
この投稿で説明されているように、アクセス許可ベースのアクセス制御を実装したいと考えています。
私は実装に精通していません-これを最初から最後まで実装する方法に関する詳細な例はありますか?
これを(ほとんど)解決したので、参考のためにここに投稿します。このソリューションは、Grails 2.2.4 および Spring Security 2.0 RC で動作します。
1) セキュリティ ドメイン モデル 記事で説明されているようにセキュリティ ドメイン クラスをモデル化すると、最終的に次のドメインが作成されます。 - パーミッション - ロール - RolePermission - ユーザー - ユーザーロール
2) ユーザーの権限のクエリ User クラスが getAuthorities() メソッドの権限として Roles ではなく Permissions を返すことを確認します。
/**
* Gets authorities for the user.
*
* It will return all of the Permissions of the User assigned by the Roles
* which the User has
*/
Set<Permission> getAuthorities() {
Set allPermissions = []
// Collect all Roles of the User
UserRole.findAllByUser(this).each { userRole ->
// Collect all Permissions from the Role
Role role = userRole.role
// Returning the collected permissions
RolePermission.findAllByRole(role).each { rp ->
allPermissions.add(rp.permission)
}
}
return allPermissions
}
3) Spring セキュリティ構成
Spring Security 構成の Config.groovy にこれがあります (関連しない部分は省略されています)。
grails {
plugin {
springsecurity {
...
userLookup {
userDomainClassName = 'limes.security.User'
}
authority {
nameField = 'name'
className = 'limes.security.Permission'
}
...
}
}
}
重要なハイライトの 1 つは、Permission クラスに準拠する必要がある authority.nameField です。name 属性は、私のモデル (および記事) では「name」と呼ばれます。
当然、User.getAuthorities() の戻り値に適合させるために、Permission クラスを authority.className として設定します。
4) セキュリティ表現での使用
上記の解決策では、"ROLE_" で始まる機関名しか使用できないという Grails Spring Security プラグインの制限は解決されません。
したがって、「PERM_PERMISSION1」のようなアクセス許可を呼び出したい場合は、どこでもチェックするための EL 式を記述する必要があります (特に、コントローラーの @Secured 注釈と静的 URL ルールで)。
だから代わりに
@Secured(["PERM_PERMISSION1"])
あなたが書く
@Secured(["hasRole('PERM_PERMISSION1')"])
Spring セキュリティ プラグインを見たことがありますか? 主なドキュメントはこちら
この投稿のように、Shiro プラグインも検討できます。Spring セキュリティ プラグインの方がシンプルだと思いますが、投稿で説明されているように、Shiro プラグインにはいくつかの利点があります。