使用Grails結(jié)合acegi開發(fā)權(quán)限設(shè)置總結(jié)

          最近,研究了一下如何用Grails 結(jié)合 Spring acegi 開發(fā)一個權(quán)限設(shè)置的例子。

          需求:

             當(dāng)管理員點(diǎn)開一個role頁面后,顯示該role具有的權(quán)限和系統(tǒng)所有的權(quán)限,可以對其修改。




           思路:

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

                       /project/create**   項(xiàng)目創(chuàng)建

                       /project/list**      項(xiàng)目列表

                       /project/edit**     項(xiàng)目編輯

                       /project/delete**   項(xiàng)目刪除

           

              在查看某個rolerequestmap(比如點(diǎn)擊edit),使用如下sql語句 獲取該role對應(yīng)的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]
              }

          當(dāng)提交某個rolerequestmap修改時,采用如下方法,循環(huán)更新所有的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: 
          '項(xiàng)目查看'     
                       )
                       projectListMap.save()
                       
                       def projectCreateMap 
          = new Requestmap(
                               url: 
          '/project/create**',
                               configAttribute: 
          'ROLE_ADMIN'
                               description: 
          '項(xiàng)目新增'
                       )
                       projectCreateMap.save()
                       
                       def projectEditMap 
          = new Requestmap(
                               url: 
          '/project/edit**',
                               configAttribute: 
          'ROLE_ADMIN',
                               description: 
          '項(xiàng)目修改'         
                       )
                       projectEditMap.save()
                       
                       def projectDelMap 
          = new Requestmap(
                               url: 
          '/project/delete**',
                               configAttribute: 
          'ROLE_ADMIN',
                                  description: 
          '項(xiàng)目刪除'              
                       )
                       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默認(rèn)生成的show view中,其editdelete的方式是采用參數(shù)來提交的,其提交格式類似/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顯示額外的權(quán)限描述信息。

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

          公告


          導(dǎo)航

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

          統(tǒng)計

          常用鏈接

          留言簿(13)

          我參與的團(tuán)隊

          隨筆分類(69)

          隨筆檔案(68)

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安图县| 九江市| 宜兰市| 苍南县| 武强县| 当阳市| 旺苍县| 巴南区| 津市市| 巴塘县| 桂东县| 鄄城县| 新沂市| 新竹县| 那坡县| 华容县| 抚宁县| 岗巴县| 敦化市| 仪陇县| 胶州市| 德令哈市| 宜阳县| 阜城县| 潜江市| 汽车| 塔河县| 晋宁县| 印江| 乾安县| 汝城县| 革吉县| 留坝县| 沙雅县| 英吉沙县| 乌兰县| 博客| 巴中市| 攀枝花市| 新乡市| 缙云县|