wake

          JSP權限控制(二)

          今天把源代碼貼出來 按照代碼再加點解釋。

          ?

          1 )首先建立管理用戶表,其中 UserPopedom 記錄用戶的權限字符,其實也就是一些 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 )按照上面的表格建立該用戶的對象

          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 )對整個后臺的控制我這里分為了兩部分,一部分是欄目的顯示控制,一部分是資源(頁面)的操作控制。

          其中欄目的顯示控制解釋為:以新聞欄目為例,如果某用戶沒有新聞欄目的任何管理權限(增、改、刪、申等),那么在后臺的管理菜單中將不顯示新聞欄目。否則,只要某用戶擁有其中任何一個權限,新聞欄目則顯示。這里要掌握的要領是,所有和新聞權限相關的頁面命名必須以 News 打頭,這樣將來決定顯示與否就以該用戶的權限字符中是否能找到 News 為依據。該功能的實現我寫了 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 中實現),也可在 JSP 中直接調用!

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

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

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

          新聞欄目 < br >

          </ ww:if >

          對于資源(頁面)的操作控制我是使用 Filter 來進行控制的, 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();

          ?????? // 獲取當前頁面文件名

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

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

          ??????

          ?????? try {

          ?????????? // 排除后臺不作權限控制的頁面名

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

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

          ????????????? // 獲取網站訪問根目錄

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

          ????????????? // 用當前頁面文件名與用戶權限字符比較

          ????????????? 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 關于過濾器配置

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

          ?

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

          ?

          這次這個簡單的權限設計從開始到完成斷斷續續用了將近 3 天的時間,一切都是在摸索中進行。其實上面的設計思路經過優化和復雜化也可以設計為符合 RBAC 規范的例子。那需要我們在用戶和權限之間再加一個基本的角色進去。這樣用戶對應的是角色,而角色去對應權限。至于其它的就由我們自己自由發揮了呵呵,這次關于權限的試驗就到此了,讓大家見笑了。

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

          Feedback

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

          如果在開發過程中頁面名字要改變,那豈不是很麻煩?  回復  更多評論   

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

          建個資源文件,以數字對應文件,再進行驗證。見過有一個系統曾是這樣設計。  回復  更多評論   

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

          樓主很厲害!
          權限控制這個東西看似簡單 實際上如果真要自己去實現還是比較復雜
          幸運的是關于權限管理有很多開源方案可以使用.
            回復  更多評論   

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

          @Jonney
          我當初考慮到了這個問題,但任何一種實現方法都有它的缺陷和規則,而且這也只是一個初步的設計。其實按照二樓的那個方法就可以比較好的解決這個問題。歡迎討論...  回復  更多評論   

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

          @bladefenix
          厲害實在不敢當,不懂的地方實在太多太多了,這幾天去應聘好多基本的問題都回答錯了呵呵,一起學習
            回復  更多評論   

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

          這樣做的確很麻煩,其實可以有多個用例,管理員,瀏覽者等,只要進行用戶角色認證之后即可用Filter來進行過濾,請求的權限了。  回復  更多評論   

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

          fdgrarerew  回復  更多評論   

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

          看不明白  回復  更多評論   

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

          嗯,看了看,可以借鑒一下!覺得二樓說的有道理,再加一個配置文件用來對應JSP文件名會更好,不過這也只是樓主的一個簡單設計,就一些簡單的應用還是可以參考一下的!  回復  更多評論   

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

          這仿佛有問題呵呵,我之前也這樣做過但是,其實,當前請求,雖然被攔截了,,但實際上它還是會把本次請求執行完成的呵.  回復  更多評論   

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

          以前也這樣想過,但感覺這個方法有點笨,這幾天正在做權限,想做一個方便實用的方法,一起提高吧.  回復  更多評論   

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

          強,汗,又強又汗。牛人阿!  回復  更多評論   

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

          很好很強大,嘗試中。。  回復  更多評論   

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

          very good!  回復  更多評論   

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

          太搓了了  回復  更多評論   



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


          網站導航:
           
          主站蜘蛛池模板: 隆化县| 石嘴山市| 涿州市| 阿克陶县| 宁国市| 丰台区| 大方县| 涟源市| 枣阳市| 永泰县| 孟州市| 虹口区| 定州市| 文登市| 柯坪县| 栾川县| 布尔津县| 济源市| 昂仁县| 赣榆县| 平邑县| 邛崃市| 温宿县| 紫云| 奈曼旗| 扎兰屯市| 清远市| 永州市| 射洪县| 岑溪市| 金阳县| 乐昌市| 株洲市| 宁化县| 田阳县| 乐清市| 临汾市| 延川县| 商水县| 张北县| 景洪市|