web工程的权限管理- 佳鱼的家- JavaEye技术网站
  我的web论文项目分为前台和后台管理,所以需要实现权限管理,只有管理员才可以访问后台的页面以及业务管理。
  先将实现的思路描述一下。
  数据库端,我建立了最基本的用户,角色,权限3张表,由于它们都是多对多的关系,所以至少需要5张表,也就是再添加2张关系表。
  由于每登陆一个页面都需要进行权限验证。所以,最简单的方式是建立一个过滤器。对于登陆,错误和权限不够的页面和功能类要自动放行,对与其他的页面和功能类都需要进行验证,验证通过了,才放行。
  大致的思路就是这样的,具体的实现,下面也给出了。
  首先,给出了数据库里的5张表。数据库用的是sqlserver 2005
use computershop
go
//用户表
create table tb_user(
	user_id int primary key identity(1,1),
	user_pw varchar(40) not null,
	user_account varchar(40) not null,
	user_name varchar(40) not null,
	user_regtime Datetime ,
	user_sex varchar(40) ,
	user_age int ,
	user_identity varchar(60) ,
	user_email varchar(60) ,
	user_tel varchar(40) ,
	user_address varchar(40) 
)
//角色表
create table tb_role(
	role_id int primary key identity(1,1),
	role_name varchar(40) 
)
//权限表
create table tb_pur(
	pur_id int primary key,
	pur_name varchar(40) not null,
	pur_page varchar(40) not null
)
//用户角色关系表
create table tb_user_role(
	user_role_id int primary key identity(1,1),
	user_role_userid int ,
	user_role_roleid int 
)
//角色权限关系表
create table role_pur(
	role_pur_id int primary key identity(1,1),
    role_pur_roleid int ,
    role_pur_purid int 
)


  登陆页面,登陆功能,以及错误页面都需要先初始化,然后用过滤器才能引用,初始化是在web.xml文件设置的。
//过滤器会对.jsp和.do结尾的请求进行权限验证
 
<filter>
		<filter-name>filter</filter-name>
		<filter-class>com.whpu.computershop.filter.Filter</filter-class>
//exceputPage参数是过滤器自动放行的页面及功能类。	
//ValidateUserAction是登陆后的验证类
//computershop_admin_login是登陆首页
//error是错误页面
//computershop_admin_nopurview是权限不够页面	
<init-param>
			<param-name>exceputPage</param-name>
			<param-value>
				ValidateUserAction,computershop_admin_login,error,computershop_admin_nopurview
			</param-value>
		</init-param>
		<init-param>
			<param-name>no-purview-page</param-name>
			<param-value>computershop_admin_nopurview.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>LoginPage</param-name>
			<param-value>computershop_admin_login.jsp</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>filter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>filter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

  ValidateUserAction类,登陆后的验证 类。首先,需要验证用户是否存在,然后再验证用户的权限,并将权限保存到session里。
package com.wphu.computershop.struts.action;

import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.actions.DispatchAction;


import com.ibatis.sqlmap.client.SqlMapClient;
import com.whpu.computershop.ibatis.core.IbatisSqlMapClientFactory;
import com.whpu.computershop.ibatis.dao.TbPurDAO;
import com.whpu.computershop.ibatis.dao.TbPurDAOImpl;
import com.whpu.computershop.ibatis.dao.TbUserDAO;
import com.whpu.computershop.ibatis.dao.TbUserDAOImpl;
import com.whpu.computershop.ibatis.pojo.TbPur;
import com.whpu.computershop.ibatis.pojo.TbUser;
import com.whpu.computershop.ibatis.pojo.UserRolePurPOJO;
import com.wphu.computershop.struts.form.AdminUserForm;

public class ValidateUserAction extends DispatchAction {


	public ActionForward AdminValidateUser(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		AdminUserForm valFrom=(AdminUserForm) form;
		
		String username = valFrom.getUser().getUserAccount();
		String password = valFrom.getUser().getUserPw();
		SqlMapClient sqlmap=IbatisSqlMapClientFactory.getSqlmap();
		TbUserDAO urpDAO=new TbUserDAOImpl(sqlmap);
		try {	
			Object object = urpDAO.selectbymap(username, password);
//如果为空,表示用户不存在,返回错误信息,这里用到了struts里的action验证.
			if (object == null) {
				request.setAttribute("validateFlag", "validateFault");
				ActionMessages messages=new ActionMessages();
				ActionMessage message=new 	ActionMessage("computershop_admin_login_userfail");
				messages.add("computershop.admin.faillogin",message);
				saveMessages(request, messages);
				return mapping.getInputForward();
			} 
//如果不为空,进一步判断用户的权限,并保存到用户的session里。
else {
				TbUser user = (TbUser) object;
				StringBuffer AllPurview = new StringBuffer();
				List list=urpDAO.selectbyurp(user.getUserId());
				for (Iterator<UserRolePurPOJO> itr = list.iterator(); itr
						.hasNext();) {
					UserRolePurPOJO pur = itr.next();
					AllPurview.append(pur.getPurPage()).append("+");
				}
				request.getSession().setAttribute("purview",
						AllPurview.toString());
				request.getSession().setAttribute("user", user);
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return  mapping.findForward("sucesspage");
	}
	
}


  {zh1},给出过滤器的代码,filter类。
package com.whpu.computershop.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Filter implements javax.servlet.Filter {

	private static String exceputePage;
	private static String noPurviewPage;
	private static String loginPage;

	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		req.setCharacterEncoding("UTF-8");
		res.setCharacterEncoding("UTF-8");
		String uri = req.getRequestURI();
		int startIndex = uri.lastIndexOf("/");
		int endIndex = uri.lastIndexOf(".");
//cmd是用户的请求地址的{zh1}一段。比如:*****/*****/[color=red]***[/color].jsp,红色部分是我们需要的,我们的session里保存的权限就是这段字符串。
		String cmd = uri.substring(startIndex + 1, endIndex);
//如果请求的地址是登陆或错误等页面,则自动放行。
		if (exceputePage.indexOf(cmd) >= 0) {
			chain.doFilter(req, res);
			return;
		} else {
			Object object = req.getSession().getAttribute("purview");
//如果权限为空,打回到登陆页面
			if (object == null) {
				res.sendRedirect(loginPage);
				return;
			}
//不为空,用checkPur方法进行权限判断
 else {
				if (checkPur(object, cmd)) {
					chain.doFilter(req, res);
					return;
				} else {
					res.sendRedirect(noPurviewPage);
					return;
				}

			}
		}

	}

	private boolean checkPur(Object object, String cmd) {
		boolean flag = false;
		String pur = (String) object;
		if (pur.indexOf(cmd) >= 0) {
			flag = true;
		}
		return flag;
	}
//引用web.xml资源文件里的初始化参数
	public void init(FilterConfig config) throws ServletException {
		exceputePage = config.getInitParameter("exceputPage");
		noPurviewPage = config.getInitParameter("no-purview-page");
		loginPage = config.getInitParameter("LoginPage");

	}

}


  到这里,一个完整的权限管理就实现了。


 
 
 
 


 


 
郑重声明:资讯 【web工程的权限管理- 佳鱼的家- JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——