Grails w/Spring安全内核只允许所有者在GSP中更新
有一些代码要添加到控制器闭包中,这很好,但是如果我想使用grails默认的脚手架视图,但是如果用户是管理员,或者域对象为用户所有,则只显示编辑/更新按钮,该怎么办,我试过: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
<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方法是否更好?