第一种方式:利用filter、xml文件和用户信息表配合使用来实现权限管理。
  1.过滤器filter
  package cn.aaa.bbb.filter;
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import javax.servlet.Filter;
  import javax.servlet.FilterChain;
  import javax.servlet.FilterConfig;
  import javax.servlet.ServletContext;
  import javax.servlet.ServletException;
  import javax.servlet.ServletRequest;
  import javax.servlet.ServletResponse;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.apachemons.logging.Log;
  import org.apachemons.logging.LogFactory;
  import org.dom4j.Document;
  import org.dom4j.Element;
  import org.dom4j.io.SAXReader;
  import cn.aaa.bbb.domain.User;
  import cn.aaa.bbb.util.HttpUtils;
  /**
  * 过滤:后台管理的模块授权。根据:配置文件xml,根据当前session中用的管理员信息。
  * 注:不用再访问数据库。也不需要再使用什么 bean 去判断。直接在这个类里就可以判断。
  * @author cuiguangqiang
  *
  */
  public class ManagerAuthFilter implements Filter {
  protected static final Log logger = Log(ManagerAuthFilter.class);
  public static final String MAPPING_FILE = "/l";
  private ServletContext context = null;
  private Map actions = new HashMap();
  public void init(FilterConfig filterConfig) throws ServletException {
  context = ServletContext();
  if(context==null){
  ("unable to init as servlet context is null");
  return;
  }
  loadConf();
  logger.info("ManagerAuthFilter configure success.");
  }
  private void loadConf() {
  InputStream inputStream = ResourceAsStream(MAPPING_FILE);
  if (inputStream == null) {
  logger.info("unable find auth mapping file " + MAPPING_FILE);
  } else {
  actions = parseConf(inputStream);
  }
  }
  private Map parseConf(InputStream inputStream) {
  try {
  SAXReader reader = new SAXReader();
  Document document = ad(inputStream);
  return createActionMap(document);
  } catch (Exception e) {
  logger.Message());
  e.printStackTrace();
  }
  return new HashMap();
  }
  private Map createActionMap(Document document) {
  Map map = new HashMap();
  Element root = RootElement();
  //处
理XML,读入JAVA Object对象中。
  List actionList = root.elements();
  for (Iterator it = actionList.iterator(); it.hasNext();) {
  Element e = (Element) it.next();
  String actionName = e.attributeValue("name");
  String auth_value = e.element("auth-value").getTextTrim();
  map.put(actionName,auth_value);
  logger.info(actionName + " is " + auth_value);
  }
  return map;
  }
  public void doFilter(ServletRequest request, ServletResponse response,
  FilterChain chain) throws IOException, ServletException {
  //处理某次提交的Action,是否在权限定义范围内
  //权限共有:1:站长;2:编辑;0:Admin ; all 代表所有人都可以。(均需要登录)
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse resp = (HttpServletResponse) response;
  //(1)得到此次用户的提交请求
  String url = ServletPath();
  //(2)只有在配置文件中存在的 action 才进行处理
  String method = Parameter("method");
  if(method!=null){
  url = url + "?method=" + method;
  }
  String auth_value = ((url);
  if(auth_value==null){
  logger.info("action is not in Manager Auth xml.");
  chain.doFilter(request, response);
  return;
  }
  //第一,必须要登录
  // 取得当前用户;
  User manager = (User) AdminUserSession(req);
  // 检查管理用户是否登录
  if (manager == null) {
  resp.ContextPath()+"/sessionLost.do");
  return;
  }
  //第二,必须在权限定义范围内
  if(auth_value.indexOf("all")>=0){
  chain.doFilter(request, response);//必须返回给上一层。
  return ;
  }
  else{
  //    String currUserAuth = ","+String( Lever())+",";
  String currUserAuth = String( Lever());
  if(auth_value.indexOf(currUserAuth)>=0){
  chain.doFilter(request, response);//必须返回给上一层。
  return ;
  }
  else{
  resp.ContextPath()+"/accessdenied.do");
  return ;
  }
  }
  }
  public void destroy() {
  logger.info("in authfilter destroy");
  }
  }
  2.xml文件
  xml只给出了部分内容,不过所有的内容都包括了。
  <?xml version="1.0" encoding="UTF-8"?>
  <!--
  权限共有:0:Admin 具有所有权限包括增删改用户; 1:站长 ;2:编辑;
  -->
  <mapping>
  <!--xxxx管理模块xx列表,报名选手和历史比赛查询部分-->
  <action name="/listallmatch.do"><auth-value>0,1</a
uth-value></action>
  <action name="/matchManager.do"><auth-value>0,</auth-value></action>
  <action name="/rewrite.do"><auth-value>0,1</auth-value></action>
  <action name="/leftHome.do"><auth-value>all,</auth-value></action>
  <action name="/login.do"><auth-value>all,</auth-value></action>
  </mapping>
  3.用户表里面有一个用来保存用户级别的字段level,具体用户表的信息有以下内容,我用实体类来表示用户表的信息,因为没有表结构了。
  /** The composite primary key value.*/
  private String id;
  /**
  * 用户编号
  */
  private String userId;
  /** The value of the simple username property. */
  private String username;
  /** The value of the simple password property. */
  private String password;
  /**
  * 0:Admin;1:站长;2:编辑;
  */
  private int lever=1;
  /**
  * 创建用户的日期
  */
  private Date createDate;
  所有的操作都显示在页面上,当点击该操作时,才进行权限控制,抛出是否该用户有没有该功能的权限。
  第二种方式:利用专门的权限表来维护用户权限,根据登录的用户的权限信息判断谋个功能是否显示在页面上,来实现权限的控制。
  1.不用数据库表了,我用实体类的属性来表示。
  private String id;
  /**
  * 管理员id
  */
  private String employeeid;
  /**
  *管理功能id
  */
  private String urlid;
  /**
  * 功能名称
  */
  private String urlname;
  超级管理员给每一个用户分配权限,然后添加到该张表中。登录用户根据自己的权限可以判断是否显示该功能。
权限控制表设计(用户+角+权限)
大概有这几种模式:
用户+组+角+权限
用户+组+权限
用户+角+权限
用户+权限
两种权限管理,其一是功能权限的管理,而另外一种则是资源权限的管理
A.数据库表形式
1.用户表
用户编号, 用户名, 密码, 角编号
2.角表
角编号, 角名
3.功能表(主要保存系统功能清单)
编号, 功能名称, 父编号, URL
4.角权限对应表
编号, 角编号, 功能编号, 权限
------------------------------------------------------------------------------------
import java.util.Set;     
public class UserVo {     
private Integer id;     
private String uname;     
private String password;     
private Level level;     
public Level getLevel() {     
return level;     
}     
public void setLevel(Level level) {     
t
his.level = level;     
}     
public String getUname() {     
return uname;     
}     
public void setUname(String uname) {     
this.uname = uname;     
}     
public String getPassword() {     
return password;     
}     
public void setPassword(String password) {     
this.password = password;     
}     
public Integer getId() {     
return id;     
}     
public void setId(Integer id) {     
this.id = id;     
}     
}     
public class Level {     
private Integer id;     
private String levelName;     
private Set<Quanxian> qx = new HashSet<Quanxian>(0);     
public Integer getId() {     
return id;     
}     
public void setId(Integer id) {     
this.id = id;     
}     
public String getLevelName() {     
return levelName;     
}     
public void setLevelName(String levelName) {     
this.levelName = levelName;     
}     
public Set<Quanxian> getQx() {     
return qx;     
}     
public void setQx(Set<Quanxian> qx) {     
this.qx = qx;     
}     
}     
public class Quanxian {     
private Integer id;     
private String quanxian;     
private Integer fatherid;     
private String url;     
public Integer getFatherid() {     
return fatherid;     
}     
public void setFatherid(Integer fatherid) {     
this.fatherid = fatherid;     
}     
public Integer getId() {     
return id;     
}     
public void setId(Integer id) {     
this.id = id;     
}     
public String getQuanxian() {     
return quanxian;     
}     
public void setQuanxian(String quanxian) {     
this.quanxian = quanxian;     
}     
public String getUrl() {     
return url;     
}     
public void setUrl(String url) {     
this.url = url;     
}     
}     
public class AdminLoginCheck extends HttpServlet implements Filter {     
//通过 一个过滤器 Filter 进行权限控制     
private FilterConfig filterConfig;     
//Handle the passed-in FilterConfig     
public void init(FilterConfig filterConfig) throws ServletException {     
this.filterConfig = filterConfig;     
}     
//Process the request/response pair     
public void doFilter(ServletRequest request, ServletResponse response,     
java xml是什么FilterChain filterChain) {//System.out.Class()+": doFilter()");     
HttpServletRequest req = (HttpServletRequest)request;     
//System.out
.ServletPath());     
HttpServletResponse res = (HttpServletResponse)response;     
HttpSession ses = Session();     
Uservo uervo =Attribute("user")     
try {//System.out.println("");     
if(uervo ==null)     
{     
res.ContextPath());     
}else{     
Boolean allow= false ;     
Set<Quanxian> qxs = Level().getQx();     
For(Quanxian o:qxs){     
Url().ServletPath())){     
allow=true;     
}     
}     
If(allow){     
filterChain.doFilter(request, response);}     
}     
} catch (ServletException sx) {     
} catch (IOException iox) {     
}     
}     
/
/Clean up resources     
public void destroy() {     
}     
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。