<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    使用Grails結合acegi開發權限設置總結

    最近,研究了一下如何用Grails 結合 Spring acegi 開發一個權限設置的例子。

    需求:

       當管理員點開一個role頁面后,顯示該role具有的權限和系統所有的權限,可以對其修改。




     思路:

    1)將uri定義在requestmap中,在運行過程中通過filter判斷是否當前用戶有權限。涉及的對象Person, Authority, Requestmap
    2)借助 acegi提供的 requestmap, 將系統的權限都已requestmap的形式體現出來,如

                 /project/create**   項目創建

                 /project/list**      項目列表

                 /project/edit**     項目編輯

                 /project/delete**   項目刪除

     

        在查看某個rolerequestmap(比如點擊edit),使用如下sql語句 獲取該role對應的requestmap,在頁面上顯示出來
    private List findRequestmapsByRole(authority)
        {
            Requestmap.executeQuery(
                    
    "SELECT rm FROM Requestmap rm " +
                    
    "WHERE rm.configAttribute LIKE :roleName",
                    [roleName: 
    '%'+authority.authority+'%'])
        }

    顯示過程如下,resourceMap中的keyrequestmap, valuetrue 或者false,然后就可以在前臺的checkbox中顯示出來

    private Map buildAuthorityModel(authority) {

            List requestmaps 
    = Requestmap.list()
            requestmaps.sort { r1, r2 
    ->
                r1.url 
    <=> r2.url
            }
            List ownedRequestmaps 
    = findRequestmapsByRole(authority)
            
            Set authResourcesNames 
    = []
            
    for (requestmap in ownedRequestmaps) {
                authResourcesNames 
    << requestmap.url
            }
            LinkedHashMap
    <Requestmap, Boolean> resourceMap = [:]
            
    for (requestmap in requestmaps) {
    resourceMap[(requestmap)] 
    = authResourcesNames.contains(requestmap.url)
            }
            System.out.println(resourceMap);    
            
    return [authority: authority, resourceMap: resourceMap]
        }

    當提交某個rolerequestmap修改時,采用如下方法,循環更新所有的requestmap


     

    private void updateRequestmaps(authority) {
            List requestmaps 
    = Requestmap.list()
            
    for (requestmap in requestmaps) 
            {
                String configAttribute 
    = requestmap.configAttribute
                Set parts 
    = configAttribute.split(',') as Set
                String roleName 
    = authority.authority
                
                String value 
    = params.get(requestmap.url)
                
    //request map checked
                if ('on' == value)
                {
                    parts.add(roleName)
                }
                
    else 
                {
                    parts.remove(roleName)
                }
                requestmap.configAttribute 
    = parts.join(',')
                System.out.println(parts)
            }

     

     具體步驟如下:

      1)      BootStrap中建立幾個Role, 建立幾個requestmap

    2)      將這些requestmap 分配給一個超級管理員(ROLE_ADMIN)

    class BootStrap {

        def authenticateService

         def init 
    = { servletContext ->

             Person.withTransaction {
                 def me 
    = new Person(
                         
    //username: "sarbogast",
                         username: "admin",
                         userRealName: 
    "Sebastien Arbogast",
                         passwd: authenticateService.encodePassword(
    "111111"),
                         enabled: 
    true,
                         email: 
    "sebastien@epseelon.com"
                 )
                 me.save()
                 
                 def user 
    = new Person(
                         
    //username: "sarbogast",
                         username: "leiw",
                         userRealName: 
    "leiw dandan",
                         passwd: authenticateService.encodePassword(
    "111111"),
                         enabled: 
    true,
                         email: 
    "leiw@epseelon.com"
                 )
                 user.save()
                 
                 def projectAdmin 
    = new Person(
                         
    //username: "sarbogast",
                         username: "project",
                         userRealName: 
    "project admin",
                         passwd: authenticateService.encodePassword(
    "111111"),
                         enabled: 
    true,
                         email: 
    "project@epseelon.com"
                 )
                 projectAdmin.save()
                 
                 
                 def adminAuth 
    = new Authority(
                         description: 
    "administrator",
                         authority: 
    "ROLE_ADMIN"
                 )
                 adminAuth.save()
                 
                 def projectAdminAuth 
    = new Authority(
                         description: 
    "project administrator",
                         authority: 
    "ROLE_PROJECT_ADMIN"
                 )
                 projectAdminAuth.save()
                 
                 
                 def userAuth 
    = new Authority(
                         description:
    "user",
                         authority: 
    "ROLE_USER"
                 )
                 userAuth.save()
                 
                 me.addToAuthorities(adminAuth)
                 me.addToAuthorities(userAuth)
                 projectAdmin.addToAuthorities(projectAdminAuth)
                 user.addToAuthorities(userAuth)
                 
                 
                 def authorityMap 
    = new Requestmap(
                         url: 
    '/authority/**',
                         configAttribute: 
    'ROLE_ADMIN',
                         description: 
    '角色管理'
                             
                 )
                 authorityMap.save()
                 
                 
                 def requestmapMap 
    = new Requestmap(
                         url:
    '/requestmap/**',
                         configAttribute: 
    'ROLE_ADMIN',
                         description: 
    '資源管理'      
                 )
                 requestmapMap.save()
                 
                 def projectListMap 
    = new Requestmap(
                         url: 
    '/project/list**',
                         configAttribute: 
    'ROLE_USER, ROLE_ADMIN, ROLE_PROJECT_ADMIN',
                         description: 
    '項目查看'     
                 )
                 projectListMap.save()
                 
                 def projectCreateMap 
    = new Requestmap(
                         url: 
    '/project/create**',
                         configAttribute: 
    'ROLE_ADMIN'
                         description: 
    '項目新增'
                 )
                 projectCreateMap.save()
                 
                 def projectEditMap 
    = new Requestmap(
                         url: 
    '/project/edit**',
                         configAttribute: 
    'ROLE_ADMIN',
                         description: 
    '項目修改'         
                 )
                 projectEditMap.save()
                 
                 def projectDelMap 
    = new Requestmap(
                         url: 
    '/project/delete**',
                         configAttribute: 
    'ROLE_ADMIN',
                            description: 
    '項目刪除'              
                 )
                 projectDelMap.save()
                 
                 
    new Project(title:'test1', description:'').save();
                 
    new Project(title:'test2', description:'').save();
                 
    new Project(title:'test3', description:'').save();
             }
         }
         def destroy 
    = {
         }
    }
      3) Acegirequstmap只是對url的過濾,對于grails默認生成的show view中,其editdelete的方式是采用參數來提交的,其提交格式類似/project/index?action_edit=edit, 所以acegi無法正確截獲
    <g:form>
      
    <g:hiddenField name="id" value="${projectInstance?.id}" />
      
    <span class="button"><g:actionSubmit class="edit" action="edit" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /></span>
       
    <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>
    </g:form>

    只能將
    form改成原HTML原始的方式

    <form action="/todolist/project/edit"></form>
    <form action="/todolist/project/delete" method="post" ></form>

     

    4) 修改requestmap domain,增加description,方便checkbox顯示額外的權限描述信息。

    posted on 2012-02-14 17:01 想飛就飛 閱讀(769) 評論(0)  編輯  收藏 所屬分類: Groovy/Grails

    公告


    導航

    <2012年2月>
    2930311234
    567891011
    12131415161718
    19202122232425
    26272829123
    45678910

    統計

    常用鏈接

    留言簿(13)

    我參與的團隊

    隨筆分類(69)

    隨筆檔案(68)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: a视频免费在线观看| 亚洲性猛交XXXX| 亚洲国产成人久久精品app| 免费无码一区二区三区蜜桃| 亚洲av无码乱码在线观看野外| 亚洲男人的天堂网站| 毛片视频免费观看| 日本亚洲精品色婷婷在线影院 | a一级爱做片免费| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 91精品成人免费国产| 亚洲色成人网站WWW永久| 又粗又长又爽又长黄免费视频 | 亚洲欧洲精品久久| 亚洲免费一级视频| 久久久久亚洲精品日久生情| 久久国产乱子免费精品| 亚洲美女激情视频| 成人女人A级毛片免费软件| 亚洲精品人成网在线播放影院| 成年在线网站免费观看无广告| 亚洲AV无码国产剧情| 亚洲精品国产高清不卡在线| 国产精品成人啪精品视频免费| 亚洲精品蜜桃久久久久久| 午夜老司机永久免费看片| 精品日韩99亚洲的在线发布| 免费看AV毛片一区二区三区| 一级做a爰片久久毛片免费陪| 亚洲精品蜜桃久久久久久| 蜜臀98精品国产免费观看| 亚洲中文字幕无码爆乳app| 亚洲AV无码乱码在线观看性色扶| 黄色网址在线免费| 亚洲91精品麻豆国产系列在线| 午夜老司机免费视频| 亚洲免费日韩无码系列| 亚洲自偷自拍另类图片二区| 四虎影库久免费视频| 久久狠狠躁免费观看| 亚洲丁香婷婷综合久久|