Grails w/Spring安全内核只允许所有者在GSP中更新

Grails w/Spring安全内核只允许所有者在GSP中更新,grails,spring-security,gsp,Grails,Spring Security,Gsp,有一些代码要添加到控制器闭包中,这很好,但是如果我想使用grails默认的脚手架视图,但是如果用户是管理员,或者域对象为用户所有,则只显示编辑/更新按钮,该怎么办,我试过: <sec:access expression="hasRole('ROLE_MANAGER') || (projectInstance.owner == springSecurityService.currentUser)"> <span class="button"><g:actionS

有一些代码要添加到控制器闭包中,这很好,但是如果我想使用grails默认的脚手架视图,但是如果用户是管理员,或者域对象为用户所有,则只显示编辑/更新按钮,该怎么办,我试过:

<sec:access expression="hasRole('ROLE_MANAGER') || (projectInstance.owner == springSecurityService.currentUser)">
   <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
</sec:access>
但是access类似乎不允许ORs:

Error processing GroovyPageView: Error executing tag <g:form>: Error executing tag <sec:access>: Cannot handle (124) '|' 

有人做过类似的事情吗?

我觉得那样做很愚蠢。更好的方法是在控制器中执行,如下所示:

 def edit = {
    def projectInstance = Project.get(params.id)
    def managerOrAdmin = SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN,ROLE_MANAGER')
    def editable = (projectInstance.owner == springSecurityService.currentUser
                   || managerOrAdmin)
    if (!projectInstance) {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id])}"
        redirect(action: "list")
    }
    else {
        return [projectInstance: projectInstance, editable:editable]
    }
}
然后在普惠制中呢

<g:if test="${editable}">
  <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
</g:if>

这是有道理的,如果我们遵循好的编程咒语,视图应该在MVC中尽可能少地执行处理逻辑,我认为这是愚蠢的。更好的方法是在控制器中执行,如下所示:

 def edit = {
    def projectInstance = Project.get(params.id)
    def managerOrAdmin = SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN,ROLE_MANAGER')
    def editable = (projectInstance.owner == springSecurityService.currentUser
                   || managerOrAdmin)
    if (!projectInstance) {
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id])}"
        redirect(action: "list")
    }
    else {
        return [projectInstance: projectInstance, editable:editable]
    }
}
然后在普惠制中呢

<g:if test="${editable}">
  <span class="button"><g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" /></span>
</g:if>

这是有道理的,如果我们遵循好的编程咒语,视图应该在MVC中尽可能少地执行处理逻辑

我同意这种方法,因为您的表达式比简单的角色检查稍微复杂一些。如果我在几个操作中需要它,我想知道在对象中使用beforeUpdate方法是否更好?我同意这种方法,因为您的表达式比简单的角色检查稍微复杂一些。如果我在几个操作中需要这种方法,我想知道在对象中使用beforeUpdate方法是否更好?