<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 想飛就飛 閱讀(770) 評論(0)  編輯  收藏 所屬分類: Groovy/Grails

    公告


    導航

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

    統計

    常用鏈接

    留言簿(13)

    我參與的團隊

    隨筆分類(69)

    隨筆檔案(68)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲视频在线观看网址| 丁香花在线视频观看免费| 免费不卡中文字幕在线| 亚欧国产一级在线免费| 婷婷精品国产亚洲AV麻豆不片| 无码国产精品一区二区免费I6| 亚洲a∨无码精品色午夜| 亚洲精品成人片在线观看精品字幕 | 亚洲av午夜成人片精品网站| 男女超爽刺激视频免费播放| 九九免费精品视频在这里| 亚洲欧洲自拍拍偷综合| 免费亚洲视频在线观看| 69免费视频大片| 搜日本一区二区三区免费高清视频| 亚洲视频精品在线| 免费国产怡红院在线观看| 99xxoo视频在线永久免费观看| 羞羞网站免费观看| 亚洲欧洲国产经精品香蕉网| 中文字幕无码精品亚洲资源网| 韩国免费一级成人毛片| 最近免费中文字幕MV在线视频3| 亚洲熟妇成人精品一区| 亚洲天堂一区二区| 亚洲国产一成久久精品国产成人综合| 亚洲精品免费在线| 2022国内精品免费福利视频| 亚洲真人无码永久在线观看| 亚洲国产精品国自产电影| 亚洲伊人久久综合中文成人网| 成人免费视频一区| 最近中文字幕大全免费视频| 国产日韩AV免费无码一区二区三区| 色老板亚洲视频免在线观| 久久亚洲国产成人精品性色| 亚洲av永久无码精品漫画| 亚洲精品天堂成人片?V在线播放| 成人免费a级毛片| 亚洲一区免费观看| 中文字幕无线码中文字幕免费|