Grails - 仅访问对象的所有者

时间:2010-06-29 17:51:00

标签: spring grails groovy spring-security

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

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

第二件事情是类似的。我有一个侧边栏,并且有“Hello $ {currentUser.username}。currentUser是一个返回当前登录用户实例的方法。但问题是我不知道在哪里可以将此消息设置为能够在任何地方都可以使用它。我应该把它放在一些服务中并将它包含在任何地方吗?我试图创建一个由所有其他控制器扩展的ApplicationController,但这似乎不起作用。你有什么想法吗?

谢谢! 的Grzegorz

2 个答案:

答案 0 :(得分:5)

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

对于第二个问题,有一个taglib。在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/的“安全标签”部分)

答案 1 :(得分:2)

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

@Secured([ 'WHATEVER_ROLE'])

只允许创建本书的用户对其进行编辑,您可以使用authenticateService.userDomain()将用户域从认证中拉出,然后您可以将该用户与创建该书的用户进行比较(假设你在Book域上有某种createdBy属性。

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

无论如何都是这样的。