隨筆-54  評(píng)論-0  文章-2  trackbacks-0
          巴巴運(yùn)動(dòng)網(wǎng)的權(quán)限模塊總結(jié)
            因?yàn)榘桶瓦\(yùn)動(dòng)網(wǎng)的權(quán)限設(shè)計(jì)模塊對(duì)我來說,可以實(shí)現(xiàn),打算好好整理一下思路,面試時(shí)說不定還能起點(diǎn)作用,看了兩遍,自己總結(jié)下:
          權(quán)限定義/權(quán)限組(角色)模塊
          1.對(duì)系統(tǒng)的所有功能定義相應(yīng)的權(quán)限
          2.由網(wǎng)管針對(duì)不同部門不同員工分配權(quán)限組(角色),在分配角色時(shí),
            可以選擇該角色具有的權(quán)限
          3.權(quán)限攔截模塊
           
          具體步驟:
           1.設(shè)計(jì)權(quán)限實(shí)體
              聯(lián)合主鍵(SystemPrivilegePK),該類有module和privilage兩個(gè)屬性
           2.初始化權(quán)限
           3.設(shè)計(jì)權(quán)限組(角色)PrivilegeGroup實(shí)體,如果我們希望通過修改權(quán)限組添加或刪除權(quán)限,那么權(quán)限和角色之間的多對(duì)多關(guān)系的維護(hù)端由角色來維護(hù)
              private String groupid;
              private String name;
              private Set<SystemPrivilege> privileges = new HashSet<SystemPrivilege>();
          同時(shí)加上到數(shù)據(jù)庫表的映射
          當(dāng)然由于權(quán)限和角色之間的多對(duì)多關(guān)系是雙向關(guān)聯(lián),所以要在SystemPrivilege實(shí)體bean中加上和PrivilegeGroup實(shí)體Bean之間的映射

          4.實(shí)現(xiàn)權(quán)限組的添刪改
          路徑:/control/
           新建接口PrivilegeGroupService,繼承Dao<PrivilegeGroupService>,
           新建PrivilegeGroupService,繼承DaoSupport
          當(dāng)然這些Bean都需要交給Spring管理,加上相應(yīng)的注解即可
          5.實(shí)現(xiàn)權(quán)限組的分頁,這個(gè)簡單
          6.實(shí)現(xiàn)添加權(quán)限,分頁列表上的Action,新建Action,名稱為PrivilegeGroupManageAction,
            ①.第一個(gè)方法是AddUI,主要是顯示頁面
            接下來就是增刪該操作了(...)

          7.權(quán)限做完后要新建一個(gè)Action用于完成SystemPrivilege,權(quán)限組,超級(jí)管理員的初始化,初始化完成后點(diǎn)擊“確定”,進(jìn)入登陸頁面


           權(quán)限模塊的核心:                        權(quán)限攔截模塊

          1.員工要訪問control開頭的路徑,必須登陸,即粗粒度的權(quán)限攔截,這是通過Fileter實(shí)現(xiàn)的,這里我們定義為PrivilegeFilter,先從session范圍中得到employee對(duì)象,如果對(duì)象為空,就瀏覽器重定向到登陸界面,,如果登陸了,就chain.doFilter(request,response);之后在web.xml配置,這樣就實(shí)現(xiàn)粗粒度的權(quán)限控制了3
          2.對(duì)于界面上的某些功能,不是每一個(gè)登陸到系統(tǒng)的員工對(duì)頁面的功能都有操作權(quán)限,這就是細(xì)粒度的權(quán)限攔截
          關(guān)鍵是怎樣細(xì)粒度的權(quán)限控制
          怎樣實(shí)現(xiàn)細(xì)粒度的權(quán)限控制?
          每點(diǎn)擊頁面上的按鈕,都會(huì)提交給相應(yīng)的Action處理,細(xì)粒度的權(quán)限攔截就是對(duì)Action攔截,在不修改原代碼情況下,增加攔截代碼,使用的是AOP技術(shù)
           每一個(gè)功能Action都有相應(yīng)的方法處理,我們用JDK5中的注解為Action中的方法注解相應(yīng)的權(quán)限,因?yàn)槲覀冇袝r(shí)會(huì)修改方法名稱,用注解維護(hù)起來比較方便比如:
          @Permission(module="order",privilege="modify")
          public ActionForward OrderModify(){}
           
          實(shí)現(xiàn)過程:
          ①.新建注解Permission,
                     @Retention(PetentionPolicy.RUNTIME)
                     @Target(ElementType.METHOD)
                       public @interface Permission{
                           String module();
                            String privilege();
                       }
                為Action中的方法,加上注解
              只有攔截到Action中的這個(gè)方法,才能實(shí)現(xiàn)權(quán)限攔截,現(xiàn)在我們的Action已經(jīng)交給Spring管理,所以我們可以使用Spring的AOP技術(shù)進(jìn)行權(quán)限攔截,有必要復(fù)習(xí)一下AOP的知識(shí):
           在Action類上加一個(gè)注解如下:@Aspect,當(dāng)然要使這個(gè)注解起作用,我們必須在Spring的配置文件里配置:
            <aop:aspectj-autoproxy> <!--注解解析器-->
          要實(shí)現(xiàn)切面編程,抽象過程體現(xiàn)在代碼上, 就是一個(gè)采用類來描述,要是這個(gè)類起作用,我們必須要把它交給Spring管理,很郁悶
          @Aspect@Component
          public class Interceptor{
           @Pointcut("exception(org.apache.struts.action.ActionForward  cn.itcast.web.action.. * *(org.apache.struts.actionMapping,...))")
           private void actionMethod(){}
          @Around("actionMethod")
          public Object interceptor(ProceedingJoinPoint pjp) throw Throwable{
            System.out.println("攔截到了"+pjp.getSignature().getName()+"方法");
            return pjp.proceed();
           }

          注意:
          通知:
          前置通知,在攔截的方法前加通知,這個(gè)通知執(zhí)行后,被攔截的方法仍然會(huì)執(zhí)行。
          所以使用環(huán)繞通知,但是這樣的攔截只能是攔截Action實(shí)現(xiàn)的,他不能攔截繼承自DispatchAction
          原因:Spring的動(dòng)態(tài)代理技術(shù)的問題
          Spring不能對(duì)通過反射調(diào)用的方法應(yīng)用上通知(Advice)
          當(dāng)Spring發(fā)現(xiàn)我們的繼承的DispatchAction的那個(gè)類符合他攔截的要求,就會(huì)生成一個(gè)代理對(duì)象,因?yàn)闊o接口,默認(rèn)使用cglib為這個(gè)Action生成代理對(duì)象,根據(jù)cglib生成代理對(duì)象的特點(diǎn),繼承目標(biāo)類,并且重寫所有非final的方法來實(shí)現(xiàn)
           
          注:spring只會(huì)為本類定義的方法應(yīng)用通知



          posted on 2010-04-01 07:10 d66380022 閱讀(610) 評(píng)論(0)  編輯  收藏
          主站蜘蛛池模板: 綦江县| 青州市| 岳池县| 青铜峡市| 奎屯市| 娄底市| 绍兴市| 鄢陵县| 铜梁县| 天峻县| 赞皇县| 抚松县| 尤溪县| 安福县| 闽侯县| 开化县| 安仁县| 吉安县| 河曲县| 顺义区| 阿拉尔市| 广安市| 湘潭市| 凉城县| 库尔勒市| 拉孜县| 齐河县| 察雅县| 万宁市| 德惠市| 梓潼县| 盘锦市| 桐柏县| 夏河县| 海林市| 龙游县| 原阳县| 普安县| 泸定县| 遵义市| 翁源县|