<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)

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品人成网线在线播放va| 久久亚洲精品成人AV| 亚洲AV电影天堂男人的天堂| 成年女人毛片免费播放人| 激情五月亚洲色图| 成在人线AV无码免费| 亚洲日韩在线中文字幕综合| 四虎永久在线精品免费观看地址| 精品国产_亚洲人成在线| 亚洲国产综合精品中文字幕| a色毛片免费视频| 亚洲人成在线电影| 免费影院未满十八勿进网站| 亚洲码欧美码一区二区三区| 亚洲AV无码成人精品区大在线| 中文成人久久久久影院免费观看| 亚洲国产一区国产亚洲| 久久久久久久免费视频| 看成年女人免费午夜视频| 国产亚洲精品免费视频播放| 欧洲精品99毛片免费高清观看| 亚洲AV成人噜噜无码网站| 日本不卡视频免费| 爽爽爽爽爽爽爽成人免费观看| 在线电影你懂的亚洲| 女人让男人免费桶爽30分钟| 免费福利资源站在线视频| 亚洲AV综合色一区二区三区| 皇色在线视频免费网站| 一级女性全黄久久生活片免费 | 免费在线观看亚洲| 皇色在线免费视频| 亚洲综合色一区二区三区小说| 国产青草视频免费观看97| 91精品全国免费观看青青| 国产精品亚洲四区在线观看| 亚洲精品在线视频| 日本精品人妻无码免费大全| 国产无限免费观看黄网站| 亚洲av无码片在线观看| 亚洲偷自拍拍综合网|