找回来自己以前的一个项目, 用的是通过filter过滤来管理权限的方法, 很简单,但也很实用。 这个项目并不小,但这么一个类就已经可以满足其权限管理的需要了,所以其实很多时候,权限管理大家并不必要想得那么复杂, 对于不少系统,简单通过filter来管理就ok了, simple 也是一种美^_^ 在web.xml里加入

view plaincopy to clipboardprint?

<!--================权限 设置================-->
<filter>

<filter-name>Authentication</filter-name>

<filter-class>com.springside.demo.security.UrlFilter</filter-class>

<init-param>

<param-name>onError</param-name>

<param-value>/login.jsp</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>Authentication</filter-name>

<!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

<!--================权限 设置================-->
<filter>

<filter-name>Authentication</filter-name>

<filter-class>com.springside.demo.security.UrlFilter</filter-class>

<init-param>

<param-name>onError</param-name>

<param-value>/login.jsp</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>Authentication</filter-name>

<!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

view plaincopy to clipboardprint?

public class UrlFilter implements Filter {

private FilterConfig filterConfig;

private FilterChain chain;

private HttpServletRequest request;

private HttpServletResponse response;

public void destroy() {

this.filterConfig = null;

}

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

}

public void doFilter(ServletRequest servletRequest,

ServletResponse servletResponse, FilterChain chain)

throws IOException, ServletException {

this.chain = chain;

this.request = (HttpServletRequest) servletRequest;

this.response = ((HttpServletResponse) servletResponse);

String url = request.getServletPath();

if (url == null)

url = "";

// 获取session中的loginuser对象

HttpSession session = request.getSession();

LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");

if (baseUrl(url, request)) {

// 如果是登陆界面等无须权限访问的的公用界面则跳过

chain.doFilter(request, response);

} else if (loginuser == null) {

checkLogin(url);

} else {

verifyUrl(url, loginuser);

}

}

private void checkLogin(String url) throws ServletException, IOException {

// 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面

// 在登陆后记得把 loginuser 对象置于 session中

if (url.indexOf("/index.jsp") >= 0

&& "login".equals(request.getParameter("act"))) {

// 获取request中username,password

String username = request.getParameter("username");

String password = request.getParameter("password");

UserDao userDao = new UserDao();

if (userDao.authUser(username, password)) {

LoginUser user = userDao.getUser(username);

request.getSession().setAttribute("loginuser", user);

verifyUrl(url,user);

return;

}

}

response.sendRedirect("login.jsp");

}

private void verifyUrl(String url, LoginUser loginuser)

throws IOException, ServletException {

// 获取 loginuser 拥有的所有资源串

Set royurl = loginuser.getResStrings();

if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {

chain.doFilter(request, response);

} else {

response.setContentType("text/html;charset=GBK");

response

.getWriter()

.println(

"<div style='margin: 100 auto;text-align: center;"

+ "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有权限访问该资源!</div>");

}

}

/**

* 判断是否是公用界面

*/

protected boolean baseUrl(String url, HttpServletRequest request) {

if (url.indexOf("/login.jsp") >= 0) {

return true;

}

return false;

}

/**

* 判断该用户是否有权请求该url

*

* @param royurl

* user拥有的授权的的url串集合

* @param url

* 当前请求的url

* @param reqmap

* 当前request的参数

* @return 是否通过该url

*/

protected boolean pass(Set royurl, String url, Map reqmap) {

boolean match = true;

for (Iterator iter = royurl.iterator(); iter.hasNext();) {

// 获取资源

match = true;

String res_string = (String) iter.next();

if (res_string.indexOf("*") > 0) {

res_string = res_string.substring(0, res_string.indexOf("*"));

if (url.substring(0, res_string.length()).equalsIgnoreCase(

res_string)) {

return true; // 增加通配符比较

}

}

// 分割url与参数

String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结

if (!url.equalsIgnoreCase(spw[0])) {

match = false;

}

if (match && spw.length > 1) {

String[] spa = spw[1].split("\\&"); // 分拆各参数

for (int j = 0; j < spa.length; j++) {

String[] spe = spa[j].split("="); // 分拆键与值

String key = spe[0];

String value = "";

if (spe.length > 1) {

value = spe[1].trim();

}

// 轮询

String[] values = (String[]) reqmap.get(key);

if (values != null) {

for (int k = 0; k < values.length; k++) {

if (value.equalsIgnoreCase(values[k])) {

match = true;

break;

}

match = false;

}

if (!match) {

break;

}

}

}

}

if (match) {

break;

}

}

return match;

}

public static void main(String[] args) {

UrlFilter filter = new UrlFilter();

String url = "/baseProd/product.do";

Map reqmap = new HashMap();

// 当前请求productline参数是11,12

reqmap.put("productline", new String[] { "11", "12" });

String str;

Set royurl = new HashSet();

// 和授权的的url根本不同,false

royurl.add("/user.do?a=1&b=2");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数13,14时 false

royurl.add("/baseProd/product.do?productline=13&productline=14");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数11,13时 false

royurl.add("/baseProd/product.do?productline=11&productline=13");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数11时 true

royurl.add("/baseProd/product.do?productline=11");

System.out.println("match true:" + filter.pass(royurl, url, reqmap));

// 参数的不论顺序 true

royurl.add("/baseProd/product.do?productline=12&productline=11");

System.out.println("match true:" + filter.pass(royurl, url, reqmap));

royurl.clear();

// 支持 "*" 号作通配符 true

royurl.add("/baseProd/product.do*");

System.out.println("match ture:" + filter.pass(royurl, url, reqmap));

}

}

public class UrlFilter implements Filter {

private FilterConfig filterConfig;

private FilterChain chain;

private HttpServletRequest request;

private HttpServletResponse response;

public void destroy() {

this.filterConfig = null;

}

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

}

public void doFilter(ServletRequest servletRequest,

ServletResponse servletResponse, FilterChain chain)

throws IOException, ServletException {

this.chain = chain;

this.request = (HttpServletRequest) servletRequest;

this.response = ((HttpServletResponse) servletResponse);

String url = request.getServletPath();

if (url == null)

url = "";

// 获取session中的loginuser对象

HttpSession session = request.getSession();

LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");

if (baseUrl(url, request)) {

// 如果是登陆界面等无须权限访问的的公用界面则跳过

chain.doFilter(request, response);

} else if (loginuser == null) {

checkLogin(url);

} else {

verifyUrl(url, loginuser);

}

}

private void checkLogin(String url) throws ServletException, IOException {

// 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面

// 在登陆后记得把 loginuser 对象置于 session中

if (url.indexOf("/index.jsp") >= 0

&& "login".equals(request.getParameter("act"))) {

// 获取request中username,password

String username = request.getParameter("username");

String password = request.getParameter("password");

UserDao userDao = new UserDao();

if (userDao.authUser(username, password)) {

LoginUser user = userDao.getUser(username);

request.getSession().setAttribute("loginuser", user);

verifyUrl(url,user);

return;

}

}

response.sendRedirect("login.jsp");

}

private void verifyUrl(String url, LoginUser loginuser)

throws IOException, ServletException {

// 获取 loginuser 拥有的所有资源串

Set royurl = loginuser.getResStrings();

if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {

chain.doFilter(request, response);

} else {

response.setContentType("text/html;charset=GBK");

response

.getWriter()

.println(

"<div style='margin: 100 auto;text-align: center;"

+ "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有权限访问该资源!</div>");

}

}

/**

* 判断是否是公用界面

*/

protected boolean baseUrl(String url, HttpServletRequest request) {

if (url.indexOf("/login.jsp") >= 0) {

return true;

}

return false;

}

/**

* 判断该用户是否有权请求该url

*

* @param royurl

* user拥有的授权的的url串集合

* @param url

* 当前请求的url

* @param reqmap

* 当前request的参数

* @return 是否通过该url

*/

protected boolean pass(Set royurl, String url, Map reqmap) {

boolean match = true;

for (Iterator iter = royurl.iterator(); iter.hasNext();) {

// 获取资源

match = true;

String res_string = (String) iter.next();

if (res_string.indexOf("*") > 0) {

res_string = res_string.substring(0, res_string.indexOf("*"));

if (url.substring(0, res_string.length()).equalsIgnoreCase(

res_string)) {

return true; // 增加通配符比较

}

}

// 分割url与参数

String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结

if (!url.equalsIgnoreCase(spw[0])) {

match = false;

}

if (match && spw.length > 1) {

String[] spa = spw[1].split("\\&"); // 分拆各参数

for (int j = 0; j < spa.length; j++) {

String[] spe = spa[j].split("="); // 分拆键与值

String key = spe[0];

String value = "";

if (spe.length > 1) {

value = spe[1].trim();

}

// 轮询

String[] values = (String[]) reqmap.get(key);

if (values != null) {

for (int k = 0; k < values.length; k++) {

if (value.equalsIgnoreCase(values[k])) {

match = true;

break;

}

match = false;

}

if (!match) {

break;

}

}

}

}

if (match) {

break;

}

}

return match;

}

public static void main(String[] args) {

UrlFilter filter = new UrlFilter();

String url = "/baseProd/product.do";

Map reqmap = new HashMap();

// 当前请求productline参数是11,12

reqmap.put("productline", new String[] { "11", "12" });

String str;

Set royurl = new HashSet();

// 和授权的的url根本不同,false

royurl.add("/user.do?a=1&b=2");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数13,14时 false

royurl.add("/baseProd/product.do?productline=13&productline=14");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数11,13时 false

royurl.add("/baseProd/product.do?productline=11&productline=13");

System.out.println("match false:" + filter.pass(royurl, url, reqmap));

// 授权的请求参数11时 true

royurl.add("/baseProd/product.do?productline=11");

System.out.println("match true:" + filter.pass(royurl, url, reqmap));

// 参数的不论顺序 true

royurl.add("/baseProd/product.do?productline=12&productline=11");

System.out.println("match true:" + filter.pass(royurl, url, reqmap));

royurl.clear();

// 支持 "*" 号作通配符 true

royurl.add("/baseProd/product.do*");

System.out.println("match ture:" + filter.pass(royurl, url, reqmap));

}

}

LoginUser 类: view plaincopy to clipboardprint?

public class LoginUser {
private String name;

//用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"

private Set resStrings;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Set getResStrings() {

return resStrings;

}

public void setResStrings(Set resStrings) {

this.resStrings = resStrings;

}

}

public class LoginUser {
private String name;

//用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"

private Set resStrings;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Set getResStrings() {

return resStrings;

}

public void setResStrings(Set resStrings) {

this.resStrings = resStrings;

}

}

简单实用一分钟上手级权限控制相关推荐

  1. sharepoint2013列表实现项目级权限控制

    sharepoint2013列表实现项目级权限控制 分类: sharepoint 20132014-07-07 22:30 108人阅读 评论(0) 收藏 举报 sharepoint工作流sharep ...

  2. springboot 按钮权限验证_SpringBoot中实现Shiro控制ThymeLeaf界面按钮级权限控制

    需求简述 在业绩核算系统中,我们使用了SpringBoot作为项目的整体架构,使用ThymeLeaf作为前端界面框架,使用Shiro作为我们的权限控制框架,Shiro作为轻量级的权限框架,使用起来非常 ...

  3. hive表级权限控制_数据库权限管理:表、行、列级别的权限控制

    权限规则 1. 在配有主从集群时建议在主节点上做权限相关操作 2. 只有管理员和超级管理员才有将数据导入至表中的权限 3. 管理员用户赋予的是以整表为单位的权限,所有能赋予的权限为create/sel ...

  4. hive表级权限控制_Hive权限控制和超级管理员的实现

    Hive权限控制 Hive权限机制: Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 先决条件: 为了使用Hi ...

  5. 方法级权限控制-基于表达式操作

    Spring Security允许我们在定义URL访问或方法访问所应有的权限时使用Spring EL表达式,在定义所需的访问权限时如果对应的表达式返回结果为true则表示拥有对应的权限,反之则无.Sp ...

  6. 方法级权限控制-@Secured注解使用

    @Secured注解 @Secured注解标注的方法进行权限控制的支持,其值默认为disabled. 示例: @Secured("IS_AUTHENTICATED_ANONYMOUSLY&q ...

  7. 3YAdmin-专注通用权限控制与表单的后台管理系统模板

    3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及 ...

  8. 基于角色-功能-资源的权限控制模型的设计与实现-引子

    摘要 本文在RBAC基本思想的基础上,增加资源权限的概念,设计了在企业应用系统中用户权限控制的一种具体的简单实现方法. 关键字 用户权限控制 名词解释 资源权限:资源指的是纳入企业应用的一切需要管理的 ...

  9. crm---本项目的权限控制模式

    一:url权限:  最底层的权限控制,,缺点在与没有预判的机制,造成客户体验下降.           前提: 为controller中的每一个方法(即资源)定义一个资源(Resource)名称,,该 ...

最新文章

  1. 二、多并发实现接口压力测试
  2. netframework转core时文件响应流问题
  3. 基于概率统计分析的应用流特征分析
  4. asp.net三层架构应用详解【收录】
  5. Seq(HDU-6672)
  6. JS导出txt文本文件,Netsuite方案
  7. Spring boot 日志 Logback
  8. VC++ 6.0 快捷键
  9. 操作教程:摄像头通过GB28181协议注册EasyCVR的详细配置
  10. 快速清理C盘的四个方法
  11. JSON字符串生成在线生成POJO工具类
  12. 恒生UFX交易接口基本介绍说明
  13. 兆,字节,位等单位转换
  14. MATLAB(3)MATLA 求极限 求积分 求微分 求级数的和
  15. 【转】关于在.Net开发中使用Sqlite的版本选择问题
  16. 关于Android开发者的简历
  17. JLINK仿真器与ST-LINK仿真器的安装与配置.pdf
  18. strstr函数和strtok函数的使用
  19. 如何理解vue中的Dep类,太绕了
  20. 【解决 ipad做电脑副屏镜像的问题】

热门文章

  1. C# 对象与JSON字符串互相转换的三种方式
  2. MFC与OpenCv中的图片转换实例
  3. 在C++中可以用3种方法访问一个字符串
  4. 微信小程序 滚动选项卡 swiper高度自适应
  5. base64链接转为地址php,php将图片链接转换为base64编码文件流
  6. html制作柱状图教程,基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
  7. mfc140dll 丢失 微软常用运行库_微软常用运行库合集 2020.9月(32amp;64位)
  8. sqlserver查看用户名密码_php 连接sql server数据库
  9. qt为窗体部件设置阴影、类似日晕效果
  10. Android开发之添加QQ群的方法(官方代码)