考虑到权限应该可以由用户自行分配,所以静态的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