wake

          JSP權(quán)限控制(二)

          今天把源代碼貼出來 按照代碼再加點(diǎn)解釋。

          ?

          1 )首先建立管理用戶表,其中 UserPopedom 記錄用戶的權(quán)限字符,其實(shí)也就是一些 JSP 或者 ACTION 的文件名:

          CREATE TABLE [dbo].[AdminUser] (

          ?????? [UserID] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

          ?????? [UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

          ?????? [UserPass] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

          ?????? [UserPopedom] [text] COLLATE Chinese_PRC_CI_AS NULL

          ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

          2 )按照上面的表格建立該用戶的對(duì)象

          package com.wake.bean;

          ?

          public class AdminUser {

          ???

          ??? private String UserID;

          ??? private String UserName;

          ??? private String UserPass;

          ??? private String UserPopedom;

          ???

          ??? public String getUserID() {

          ?????????? return UserID;

          ??? }

          ??? public void setUserID(String userID) {

          ?????????? UserID = userID;

          ??? }

          ??? public String getUserName() {

          ?????????? return UserName;

          ??? }

          ??? public void setUserName(String userName) {

          ?????????? UserName = userName;

          ??? }

          ??? public String getUserPass() {

          ?????????? return UserPass;

          ??? }

          ??? public void setUserPass(String userPass) {

          ?????????? UserPass = userPass;

          ??? }

          ??? public String getUserPopedom() {

          ?????????? return UserPopedom;

          ??? }

          ??? public void setUserPopedom(String userPopedom) {

          ?????????? UserPopedom = userPopedom;

          ??? }

          }

          3 )對(duì)整個(gè)后臺(tái)的控制我這里分為了兩部分,一部分是欄目的顯示控制,一部分是資源(頁面)的操作控制。

          其中欄目的顯示控制解釋為:以新聞欄目為例,如果某用戶沒有新聞欄目的任何管理權(quán)限(增、改、刪、申等),那么在后臺(tái)的管理菜單中將不顯示新聞欄目。否則,只要某用戶擁有其中任何一個(gè)權(quán)限,新聞欄目則顯示。這里要掌握的要領(lǐng)是,所有和新聞權(quán)限相關(guān)的頁面命名必須以 News 打頭,這樣將來決定顯示與否就以該用戶的權(quán)限字符中是否能找到 News 為依據(jù)。該功能的實(shí)現(xiàn)我寫了 Bean 來判斷。如下:

          package com.wake.util;

          ?

          import java.util.Map;

          ?

          import com.opensymphony.xwork.ActionContext;

          import com.wake.bean.AdminUser;

          ?

          public class PopedomValidate {

          ???

          ??? public static boolean UserPopedomValidate(String pstr){

          ?????????? Map session = ActionContext.getContext().getSession();

          ?????????? AdminUser auser = (AdminUser)session.get("auser");

          ?????????? if(auser==null||auser.equals("")){

          ????????????????? return false;

          ?????????? }

          ?????????? else{

          ????????????????? if(auser.getUserPopedom().indexOf(pstr)!=-1)

          ???????????????????????? return true;

          ?????????? }

          ?????????? return false;

          ??? }

          ?

          }

          在頁面中使用如下判斷(我是在 WEBWORK 中實(shí)現(xiàn)),也可在 JSP 中直接調(diào)用!

          <%@ taglib uri = "webwork" prefix = "ww" %>

          < ww:bean name = "'com.wake.util.PopedomValidate'" id = "pd" />

          < ww:if test = '#pd.UserPopedomValidate("News")' >

          新聞欄目 < br >

          </ ww:if >

          對(duì)于資源(頁面)的操作控制我是使用 Filter 來進(jìn)行控制的, Filter 源碼如下。

          ?

          package com.wake.util;

          ?

          import java.io.IOException;

          ?

          import javax.servlet.Filter;

          import javax.servlet.FilterChain;

          import javax.servlet.FilterConfig;

          import javax.servlet.ServletException;

          import javax.servlet.ServletRequest;

          import javax.servlet.ServletResponse;

          import javax.servlet.http.HttpServlet;

          import javax.servlet.http.HttpServletRequest;

          import javax.servlet.http.HttpServletResponse;

          import javax.servlet.http.HttpSession;

          ?

          import com.wake.bean.AdminUser;

          ?

          /**

          ?* @author Administrator

          ?*

          ?*/

          public class PopedomControl extends HttpServlet implements Filter {

          ??? /**

          ??? ?*

          ??? ?*/

          ??? private FilterConfig filterConfig;

          ??? private static final long serialVersionUID = -4275105240038370264L;

          ?

          ??? /*

          ??? ?* (非 Javadoc

          ??? ?*

          ??? ?* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)

          ??? ?*/

          ??? public void init(FilterConfig arg0) throws ServletException {

          ??? }

          ?

          ??? /*

          ??? ?* (非 Javadoc

          ??? ?*

          ??? ?* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,

          ??? ?*????? javax.servlet.ServletResponse, javax.servlet.FilterChain)

          ??? ?*/

          ??? public void doFilter(ServletRequest request, ServletResponse response,

          ?????????? FilterChain filterChain) {

          ?

          ?????? HttpServletRequest servletRequest = (HttpServletRequest) request;

          ?????? HttpServletResponse servletResponse = (HttpServletResponse) response;

          ?????? HttpSession session = servletRequest.getSession();

          ?????? // 獲取當(dāng)前頁面文件名

          ?????? String url = servletRequest.getRequestURI();

          ?????? url = url.substring(url.lastIndexOf("/") + 1, url.length());

          ??????

          ?????? try {

          ?????????? // 排除后臺(tái)不作權(quán)限控制的頁面名

          ?????????? String exclude= "adminlogin.action,login.jsp,Message.jsp,loginout.jsp";

          ??? ?????? if(exclude.indexOf(url)==-1){

          ????????????? // 獲取網(wǎng)站訪問根目錄

          ????????????? String accessPath = servletRequest.getContextPath();

          ????????????? // 用當(dāng)前頁面文件名與用戶權(quán)限字符比較

          ????????????? AdminUser adminuser = (AdminUser) session.getAttribute("auser");

          ????????????? if (adminuser == null) {

          ????????????????? servletResponse.sendRedirect(accessPath + "/admin/login.jsp");

          ????????????? }else if(adminuser.getUserPopedom().indexOf(url)==-1){

          ????????????????? servletResponse.sendRedirect(accessPath + "/admin/Message.jsp");

          ????????????? }

          ?????????? }

          ?????? } catch (Exception sx) {

          ?????????? sx.printStackTrace();

          ?????? }

          ??????

          ?????? try {

          ?????????? filterChain.doFilter(request, response);

          ?????? } catch (ServletException sx) {

          ?????????? filterConfig.getServletContext().log(sx.getMessage());

          ?????? } catch (IOException iox) {

          ?????????? filterConfig.getServletContext().log(iox.getMessage());

          ?????? }

          ??? }

          ?

          ??? public void destroy() {

          ??? }

          ?

          }

          WEB.XML 關(guān)于過濾器配置

          ??? < filter >

          ?????? < filter-name > popedomcontrol </ filter-name >

          ?????? < filter-class > com.wake.util.PopedomControl </ filter-class >

          ??? </ filter >

          ??? < filter-mapping >

          ?????? < filter-name > popedomcontrol </ filter-name >

          ?????? < url-pattern > /admin/* </ url-pattern >

          ??? </ filter-mapping >

          ?

          這樣不知道大家看明白沒有

          ?

          這次這個(gè)簡(jiǎn)單的權(quán)限設(shè)計(jì)從開始到完成斷斷續(xù)續(xù)用了將近 3 天的時(shí)間,一切都是在摸索中進(jìn)行。其實(shí)上面的設(shè)計(jì)思路經(jīng)過優(yōu)化和復(fù)雜化也可以設(shè)計(jì)為符合 RBAC 規(guī)范的例子。那需要我們?cè)谟脩艉蜋?quán)限之間再加一個(gè)基本的角色進(jìn)去。這樣用戶對(duì)應(yīng)的是角色,而角色去對(duì)應(yīng)權(quán)限。至于其它的就由我們自己自由發(fā)揮了呵呵,這次關(guān)于權(quán)限的試驗(yàn)就到此了,讓大家見笑了。

          posted on 2006-04-29 17:18 wake 閱讀(10030) 評(píng)論(15)  編輯  收藏

          Feedback

          # re: JSP權(quán)限控制(二) 2006-04-29 21:20 Jonney

          如果在開發(fā)過程中頁面名字要改變,那豈不是很麻煩?  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-05-06 00:19 huifei

          建個(gè)資源文件,以數(shù)字對(duì)應(yīng)文件,再進(jìn)行驗(yàn)證。見過有一個(gè)系統(tǒng)曾是這樣設(shè)計(jì)。  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-05-08 10:52 bladefenix

          樓主很厲害!
          權(quán)限控制這個(gè)東西看似簡(jiǎn)單 實(shí)際上如果真要自己去實(shí)現(xiàn)還是比較復(fù)雜
          幸運(yùn)的是關(guān)于權(quán)限管理有很多開源方案可以使用.
            回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-05-10 13:20 wake

          @Jonney
          我當(dāng)初考慮到了這個(gè)問題,但任何一種實(shí)現(xiàn)方法都有它的缺陷和規(guī)則,而且這也只是一個(gè)初步的設(shè)計(jì)。其實(shí)按照二樓的那個(gè)方法就可以比較好的解決這個(gè)問題。歡迎討論...  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-05-10 13:22 wake

          @bladefenix
          厲害實(shí)在不敢當(dāng),不懂的地方實(shí)在太多太多了,這幾天去應(yīng)聘好多基本的問題都回答錯(cuò)了呵呵,一起學(xué)習(xí)
            回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-05-16 07:52 jenos

          這樣做的確很麻煩,其實(shí)可以有多個(gè)用例,管理員,瀏覽者等,只要進(jìn)行用戶角色認(rèn)證之后即可用Filter來進(jìn)行過濾,請(qǐng)求的權(quán)限了。  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-06-18 17:29 ddddf

          fdgrarerew  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-08-15 10:01 fasdf

          看不明白  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2006-10-30 23:51 kwx

          嗯,看了看,可以借鑒一下!覺得二樓說的有道理,再加一個(gè)配置文件用來對(duì)應(yīng)JSP文件名會(huì)更好,不過這也只是樓主的一個(gè)簡(jiǎn)單設(shè)計(jì),就一些簡(jiǎn)單的應(yīng)用還是可以參考一下的!  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2007-01-05 19:38 一手的小窩窩

          這仿佛有問題呵呵,我之前也這樣做過但是,其實(shí),當(dāng)前請(qǐng)求,雖然被攔截了,,但實(shí)際上它還是會(huì)把本次請(qǐng)求執(zhí)行完成的呵.  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2007-08-13 21:36 haoland

          以前也這樣想過,但感覺這個(gè)方法有點(diǎn)笨,這幾天正在做權(quán)限,想做一個(gè)方便實(shí)用的方法,一起提高吧.  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2008-03-07 09:23 七喜可樂

          強(qiáng),汗,又強(qiáng)又汗。牛人阿!  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二)[未登錄] 2008-06-11 15:34 knight

          很好很強(qiáng)大,嘗試中。。  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2008-10-21 19:23 xiaomeng

          very good!  回復(fù)  更多評(píng)論   

          # re: JSP權(quán)限控制(二) 2008-12-29 19:41 MM

          太搓了了  回復(fù)  更多評(píng)論   



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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 屏南县| 杭锦旗| 泉州市| 绥阳县| 大英县| 白银市| 虹口区| 绥棱县| 通辽市| 方山县| 平陆县| 四川省| 农安县| 太康县| 连南| 周口市| 长武县| 东方市| 江山市| 普安县| 平顺县| 郯城县| 志丹县| 汉阴县| 民丰县| 南澳县| 张家口市| 大新县| 天峻县| 故城县| 吴江市| 万安县| 崇州市| 姚安县| 新晃| 特克斯县| 沙田区| 杂多县| 城口县| 云和县| 兴化市|