?? ??? 針對合法的登陸,(一)和(二)的解決方案,已經(jīng)解決了用戶針對模塊和功能點(diǎn)的權(quán)限控制問題。但是如果用戶如果在地址欄手動寫入以前已經(jīng)識記的URL地址,那么用戶就可以獲取他所沒有

          的權(quán)限而進(jìn)行相關(guān)的操作。為了解決這個問題,提出了以下方案:

          ?????? 把系統(tǒng)中的某一模塊下所有鏈接地址全部錄入數(shù)據(jù)庫,然后根據(jù)請求地址和數(shù)據(jù)庫已記錄的地址進(jìn)行對比,以此進(jìn)行控制權(quán)限的判斷。
          ???????
          ?????一:把鏈接地址存入數(shù)據(jù)庫

          ?????? 把系統(tǒng)中用到的地址存入PAGE_OPERATION_TABLE,其中PAGE_ID為某一系統(tǒng)功能點(diǎn)的入口PAGE,OPERATION_IS_VALID判斷是否需要進(jìn)行權(quán)限判斷。

          ??? 二:對系統(tǒng)的ACTION進(jìn)行攔截。

          ??? *Action如果繼承自DispatchAction,則重寫*Action的execute()方法。
          ???
          @Override
          ????
          public?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,
          ????????????HttpServletRequest?request,?HttpServletResponse?response)
          ????????????
          throws?Exception?{
          ????????
          return?super.execute(mapping,?form,?request,?response);
          ????}


          ????? 配置攔截器:

          ?????
          ????<bean?id="myInterceptor"
          ????????
          class="net.better_best.www.utils.AopPriviledge">
          ????
          </bean>

          ????
          <aop:config>
          ????????
          <aop:aspect?id="aop"?ref="myInterceptor">
          ????????????
          <aop:pointcut
          ????????????????expression
          ="execution?(?org.apache.struts.action.ActionForward?net.better_best.www.*.action.*.*(..))"
          ????????????????id
          ="mycut"?/>
          ????????????
          <aop:around?pointcut-ref="mycut"?method="doBasicProfiling"?/>
          ????????
          </aop:aspect>
          ????
          </aop:config>

          ???? 實現(xiàn)攔截方法:

          ???
          package?net.better_best.www.utils;

          import?java.util.Collection;
          import?java.util.Date;
          import?java.util.List;

          import?javax.servlet.http.HttpServletRequest;

          import?org.apache.struts.action.ActionMapping;
          import?org.aspectj.lang.ProceedingJoinPoint;

          public?class?AopPriviledge?{

          ????@SuppressWarnings(
          "unchecked")
          ????
          /*
          ?????*?aop攔截,環(huán)繞通知,實現(xiàn)權(quán)限攔截;?String?name:根據(jù)name判斷管理員或會員;n代表管理員,m代表會員,n或m的值代表特定的操作;
          ?????
          */

          ????
          public?Object?doBasicProfiling(ProceedingJoinPoint?pjp)?throws?Throwable?{
          ????????Object[]?obj?
          =?pjp.getArgs();
          ????????ActionMapping?mapping?
          =?(ActionMapping)?obj[0];
          ????????HttpServletRequest?request?
          =?(HttpServletRequest)?obj[2];
          ????????String?mappingName?
          =?"";
          ????????
          if?(SessionUtil.getSessionManager(request)?!=?null?&&?request.getParameter("n")!=null)?{
          ????????????mappingName?
          =?"error_manager";
          ????????????String?requestPath?
          =?mapping.getPath()+?".do?"+?request.getQueryString().substring(0,request.getQueryString().indexOf("&"));
          ????????????List?priviledgeList?
          =?(List)?request.getSession().getAttribute("managerPriviledge");
          ????????????
          if?(priviledgeList.contains(requestPath.trim()))?{
          ????????????????
          return?priviledge(pjp,?request);
          ????????????}
          ?else?{
          ????????????????
          return?mapping.findForward(mappingName);
          ????????????}


          ????????}
          ?else?if?(SessionUtil.getSessionUser(request)?!=?null?&&?request.getParameter("m")!=null)?{
          ????????????mappingName?
          =?"error_user";
          ????????????Collection?userPriviledge?
          =?(Collection)?request.getSession().getAttribute("userPriviledge");
          ????????????
          if?(userPriviledge.contains(mapping.getPath().trim()))?{
          ????????????????
          return?priviledge(pjp,?request);
          ????????????}
          ?else?{
          ????????????????
          return?mapping.findForward(mappingName);
          ????????????}

          ????????}
          ?else?if?(SessionUtil.getSessionUser(request)?==?null?&&?request.getParameter("m")!=null)?{
          ????????????
          return?mapping.findForward("userindex");
          ????????}
          ?else?if?(SessionUtil.getSessionManager(request)?==?null&&?request.getParameter("n")!=null)?{
          ????????????
          return?mapping.findForward("index");
          ????????}
          ?else
          ????????????
          return?mapping.findForward("priviledge_error");

          ????}


          ????
          /*
          ?????*?實現(xiàn)真正的權(quán)限攔截;?String?value?:某一個權(quán)限值,為pageId;?List<PageTable>?module:
          ?????*?PageTable的集合,為某一用戶的某一模塊所具有的頁面功能集;?String?mappingName:代表頁面URL,程序異常跳轉(zhuǎn)之;
          ?????
          */

          ????
          private?Object?priviledge(ProceedingJoinPoint?pjp,
          ????????????HttpServletRequest?request)?
          throws?Throwable?{
          ????????Object?result?
          =?null;
          ????????
          long?begintime?=?new?Date().getTime();
          ????????result?
          =?pjp.proceed();
          ????????
          long?endtime?=?new?Date().getTime();
          ????????
          long?time?=?endtime?-?begintime;
          ????????System.out.println(
          "====================================================================================================================");
          ????????System.out.println(pjp.getTarget().getClass().getSimpleName()?
          +?"?????"+?request.getQueryString()?+?"??????耗時??????????"?+?time+?"??????????ms");
          ????????System.out.println(
          "====================================================================================================================");
          ????????
          return?result;
          ????}


          }



          緩存權(quán)限:

          ??List?priviledgeList?=?pageService.getPriviledgeForManager(""+manager.getManagerNroleId());
          ???????????request.getSession().setAttribute(
          "managerPriviledge",?priviledgeList);


          以上步驟是針對URL寫入的權(quán)限控制的解決方案進(jìn)行了大致的記錄。

          Feedback

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-17 15:58 by dragon904
          有沒有實現(xiàn)數(shù)據(jù)權(quán)限?不同的用戶可以訪問不同的數(shù)據(jù)。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-17 16:07 by java小爬蟲
          @dragon904
          不太明白,
          你的意思是不是信息類型,信息發(fā)布人類型,以及發(fā)布人等概念,這個在在信息表里面可以定義字段,然后在SQL中加入條件可以查詢啊。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-17 16:15 by 獨(dú)孤行
          我們現(xiàn)在的項目就是用這個方法做權(quán)限管理。。。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-17 16:27 by Lancelot
          你發(fā)的這三個東西實在太粗糙了,一些基礎(chǔ)功能都沒有考慮到(比如多場景多角色),基本上沒有什么可取的地方。
          這么說可能有點(diǎn)兒打擊你,但事實就是如此。
          建議你去好好看看acegi(spring-security)的實現(xiàn)方式;如果非要自己實現(xiàn)的話,也可以考慮用位運(yùn)算的方式來進(jìn)行匹配,也會比字符串匹配的效率要高不少。

          另外@dragon904
          你提出的問題不是訪問權(quán)限需要去考慮的問題,是需要通過數(shù)據(jù)范圍去約束的,請不要混為一談。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-17 18:00 by 53中文網(wǎng)
          沒怎么看明白

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-23 14:16 by IT者
          可讀性太差,說實話,如果你這種做法用到項目中,以后你就天天等著哭吧。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制[未登錄]  回復(fù)  更多評論   

          2010-06-23 23:22 by bobby
          @Lancelot
          能不能詳細(xì)介紹一下用位運(yùn)算的方式如何匹配,謝謝!

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-06-24 08:54 by java小爬蟲
          @IT者

          這位兄弟,有什么問題說清楚一點(diǎn)啊,

          我最討厭夸夸其談的人了。

          # re: 用戶權(quán)限的解決方案(三)----------URL寫入的權(quán)限控制  回復(fù)  更多評論   

          2010-07-02 09:16 by 威爾
          我強(qiáng)烈建議你去學(xué)習(xí)巴巴運(yùn)動網(wǎng)視頻

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 兴仁县| 石屏县| 合水县| 开江县| 陵水| 方山县| 龙江县| 阜新市| 浑源县| 寻甸| 金山区| 贡山| 蒙山县| 吉首市| 东丰县| 贵阳市| 黑龙江省| 文安县| 玉林市| 满城县| 阳山县| 邳州市| 思南县| 顺义区| 龙南县| 罗江县| 花莲市| 吴桥县| 敖汉旗| 崇仁县| 从江县| 临夏市| 故城县| 滦平县| 鄂温| 德江县| 会同县| 新干县| 武乡县| 德钦县| 镇平县|