Grails - 仅供对象所有者访问

Posted

技术标签:

【中文标题】Grails - 仅供对象所有者访问【英文标题】:Grails - access only for object's owner 【发布时间】:2011-03-09 18:31:53 【问题描述】:

我仍在开发我的第一个 Grails 应用程序。这一次,我的问题是限制特定用户对某些操作的访问。

假设用户添加了一些对象,例如图书。我想仅向管理员和添加该书的用户授予编辑书籍的权限。我目前正在使用 Acegi 插件。我知道该插件有更新版本,但我不确定它是否会改变我的问题。

第二件事有点相似。我有一个侧边栏,有“你好 $currentUser.username。currentUser 是一种返回当前登录用户实例的方法。但问题是我不知道我可以把这条消息放在哪里能够到处使用它。我应该把它放在某个服务中并在任何地方包含它吗?我尝试创建一个由所有其他控制器扩展的 ApplicationController,但这似乎不起作用。你有什么想法吗?

谢谢! 格热戈日

【问题讨论】:

【参考方案1】:

您应该使用较新的 Spring Security Core 插件,因为它有一个 ACL 附加插件,可以完全满足您的需求。详情请见http://grails.org/plugin/spring-security-acl。

对于第二个问题,有一个标签库。在 Acegi 插件中使用这个:

Hello <g:loggedInUserInfo field="username"/>

(参见http://www.grails.org/AcegiSecurity+Plugin+-+Artifacts)并在 Spring Security Core 插件中使用:

Hello <sec:username/>

(参见http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/ 的“安全标签”部分)

【讨论】:

哦,是的,我怎么会错过有关标签的信息...谢谢。我会尽快切换到新插件,希望能方便管理用户权限【参考方案2】:

对于 ROLE 访问,您只需指定特定 URL 的特定 ROLE 可以访问该操作。也就是说,如果您使用插件的 RequestMap 方法。如果您使用注释方法,只需在控制器中注释操作:

@Secured(['WHATEVER_ROLE'])

只要只允许创建图书的用户编辑它,您可以使用 authenticateService.userDomain() 将用户域从身份验证中拉出,然后您可以将该用户与创建图书的用户进行比较(假设您的 Book 域上有某种 createdBy 属性。

def loggedInUser = authenticateService.userDomain()
if (book.createdBy.equals(loggedInUser)) 
   // allow editing

反正就是这样。

【讨论】:

感谢您的回复!现在的问题是我可以把这个获取当前用户放在哪里,这样我就可以在任何地方使用这个用户的数据。例如,无论哪个控制器正在采取行动,我都希望在页面顶部看到登录的用户登录。我需要在每个控制器中定义它吗?

以上是关于Grails - 仅供对象所有者访问的主要内容,如果未能解决你的问题,请参考以下文章

Grails 迭代域类的所有 id 的最佳方法

在过滤器中访问 request.JSON 后 Grails 2.5.0 控制器命令对象绑定

Grails - 向所有域对象添加 where 子句

Grails 3 访问 node_modules

在 Grails 中缓存域对象

Grails 中的 Spring Security 提供授权