带有 Spring Security Core 的 Grails 仅允许所有者在 GSP 中更新
Posted
技术标签:
【中文标题】带有 Spring Security Core 的 Grails 仅允许所有者在 GSP 中更新【英文标题】:Grails w/ Spring Security Core only allowing owner to update in GSP 【发布时间】:2011-08-26 16:46:39 【问题描述】:This question 有一些代码要添加到控制器闭包中,这很好,但如果我想使用 grails 默认的脚手架视图,但如果用户是经理,则只显示编辑/更新按钮,或者域对象归用户所有? Reading the documentation,我试过了:
<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>
但访问类似乎不允许 OR:
Error processing GroovyPageView: Error executing tag <g:form>: Error executing tag <sec:access>: Cannot handle (124) '|'
有人做过类似的事情吗?
【问题讨论】:
【参考方案1】:我认为那将是愚蠢的。更好的方法是在控制器中这样做:
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]
然后在gsp中做
<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 方法是否更好?以上是关于带有 Spring Security Core 的 Grails 仅允许所有者在 GSP 中更新的主要内容,如果未能解决你的问题,请参考以下文章
在grails 2.2.4 spring security core 2.0中配置ldap?
Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core
Grails - 卸载 Spring Security Core
Grails + spring-security-core:用户登录后如何分配角色?
Spring Security - 访问被拒绝(用户不是匿名的)spring-security-core-4.0.3.RELEASE