考慮到權限應該可以由用戶自行分配,所以靜態的requestmap 和 controller annotations 的方法都不太合適。因此使用動態的requestmap,于是出現了一些小問題,如本文所描述:
1. 安裝acegi plugin
2. acegi的一些概念以及用法參考
http://grails.org/plugin/acegi
http://www.infoq.com/cn/articles/grails-acegi-integration
3. 問題
在grails中,默認生成的show.gsp中是使用一個form帶多個參數來提交,比如?_action_Edit=edit 或者 ?_action_Delete=delete,
但對于requestmap,它實際是對于url進行限制的,并沒有對參數做限制,所以這時候 grails提交的action就不會被requestmap檢測到。
4. 方案
requestmap權限分配機制類似如下,這里只是demo。
實際中,可以在UI界面上通過使用checkbox來代替該requestmap的URI string,完成對role進行權限的分配。
1 def projectListMap = new Requestmap(
2 url: '/project/list**',
3 configAttribute: 'ROLE_USER, ROLE_ADMIN'
4 )
5 projectListMap.save()
6
7
8 def projectCreateMap = new Requestmap(
9 url: '/project/create**',
10 configAttribute: 'ROLE_ADMIN'
11 )
12 projectCreateMap.save()
13
14 def projectEditMap = new Requestmap(
15 url: '/project/edit**',
16 configAttribute: 'ROLE_ADMIN'
17 )
采用原生的html form代替grails的actionSubmit,顯示的提交url,比如
使用
1 <form action="/todolist/project/edit">
2
..
3 </form>
4 <form action="/todolist/project/delete" method="post" >
5
..
6 </form>
代替原來的
1 <g:form>
2 <g:hiddenField name="id" value="${projectInstance?.id}" />
3 <span class="button"><g:actionSubmit class="edit" action="edit" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /></span>
4 <span class="button"><g:actionSubmit class="delete" action="delete" value="${message(code: 'default.button.delete.label', default: 'Delete')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');" /></span>
5 </g:form>
4.參考
http://grails.1312388.n4.nabble.com/acegi-requestmap-how-to-inspect-URL-parameters-td1382988.html
5. 關于這種方式,有一些缺點,就是使用原來的方式可以繞開requestmap的限制,具體請看
http://grails.1312388.n4.nabble.com/Unexpected-observations-using-spring-security-acegi-plugin-td1349785.html