我的web论文项目分为前台和后台管理,所以需要实现权限管理,只有管理员才可以访问后台的页面以及业务管理。
先将实现的思路描述一下。
数据库端,我建立了最基本的用户,角色,权限3张表,由于它们都是多对多的关系,所以至少需要5张表,也就是再添加2张关系表。
由于每登陆一个页面都需要进行权限验证。所以,最简单的方式是建立一个过滤器。对于登陆,错误和权限不够的页面和功能类要自动放行,对与其他的页面和功能类都需要进行验证,验证通过了,才放行。
大致的思路就是这样的,具体的实现,下面也给出了。
首先,给出了数据库里的5张表。数据库用的是sqlserver 2005
登陆页面,登陆功能,以及错误页面都需要先初始化,然后用过滤器才能引用,初始化是在web.xml文件设置的。
//过滤器会对.jsp和.do结尾的请求进行权限验证
ValidateUserAction类,登陆后的验证 类。首先,需要验证用户是否存在,然后再验证用户的权限,并将权限保存到session里。
{zh1},给出过滤器的代码,filter类。
到这里,一个完整的权限管理就实现了。
先将实现的思路描述一下。
数据库端,我建立了最基本的用户,角色,权限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"); } }
到这里,一个完整的权限管理就实现了。