2010-06-29 29 views
2

我还在研究我的第一个Grails应用程序。这一次,我的问题是限制特定用户访问某些操作。Grails - 只能访问对象的所有者

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

第二件事是某种类似的。我有一个边栏,有“Hello $ {currentUser.username}。currentUser是一个返回当前登录用户的实例的方法。但问题是,我不知道我可以在哪里放置此消息在任何地方都可以使用它,我应该把它放在一些服务中,并将它包含在任何地方吗?我尝试创建一个由所有其他控制器扩展的ApplicationController,但似乎并不奏效。谢谢! Grzegorz

回答

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的核心插件使用:

Hello <sec:username/>

(见http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/ “安全标签” 一节)

+0

哦,是的,我怎么会错过有关标签的信息......谢谢。 我会尽快切换到新的插件,我希望它会方便管理用户权限 – arnvald 2010-06-29 18:55:55

2

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

@Secured([“WHATEVER_ROLE”])

至于只允许谁创造了本书编辑的用户,你可以拉动用户域进行认证与authenticateService.userDomain(),然后您可以将该用户与创建该书籍的用户进行比较(假设您在Book域上有某种类型的createdBy属性。

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

这样的事情,无论如何。

+0

Thans for response!现在问题是我可以在哪里获取当前用户,以便我可以在任何地方使用此用户的数据。例如,我希望在页面顶部看到登录的用户登录信息,而不管哪个控制器正在采取行动。我需要在每个控制器中定义它吗? – arnvald 2010-06-29 18:42:32