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