2011-05-16 5 views
1

This questionコントローラのクロージャに追加するコードはありますが、これはうまくいきますが、grailsのデフォルトのスキャフォールディングビューを使用したいのに編集/ユーザがマネージャである場合、またはドメインオブジェクトがユーザによって所有されている場合はボタンが表示されますか?GrailsはSpringセキュリティコアでのみGSPで更新できるようにしました

<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> 

しかし、アクセスクラスは、論理和を許可していないよう:Reading the documentationは、私が試した

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

誰でも似た何かを行って?

答えて

3

私はそれがばかだと決めました。より良いアプローチは、コントローラでそれを行うことです。

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で可能な限り処理ロジック "

+0

あなたの式は単純なロールチェックよりも少し複雑なので、私はこのアプローチに同意します。 – Gregg

関連する問題