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

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

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

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

谢谢! 格热戈日

【问题讨论】:

    标签: spring grails groovy spring-security


    【解决方案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
    }
    

    反正就是这样。

    【讨论】:

    • 感谢您的回复!现在的问题是我可以把这个获取当前用户放在哪里,这样我就可以在任何地方使用这个用户的数据。例如,无论哪个控制器正在采取行动,我都希望在页面顶部看到登录的用户登录。我需要在每个控制器中定义它吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多