简单实用一分钟上手级权限控制
找回来自己以前的一个项目, 用的是通过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;
}
}
简单实用一分钟上手级权限控制相关推荐
- sharepoint2013列表实现项目级权限控制
sharepoint2013列表实现项目级权限控制 分类: sharepoint 20132014-07-07 22:30 108人阅读 评论(0) 收藏 举报 sharepoint工作流sharep ...
- springboot 按钮权限验证_SpringBoot中实现Shiro控制ThymeLeaf界面按钮级权限控制
需求简述 在业绩核算系统中,我们使用了SpringBoot作为项目的整体架构,使用ThymeLeaf作为前端界面框架,使用Shiro作为我们的权限控制框架,Shiro作为轻量级的权限框架,使用起来非常 ...
- hive表级权限控制_数据库权限管理:表、行、列级别的权限控制
权限规则 1. 在配有主从集群时建议在主节点上做权限相关操作 2. 只有管理员和超级管理员才有将数据导入至表中的权限 3. 管理员用户赋予的是以整表为单位的权限,所有能赋予的权限为create/sel ...
- hive表级权限控制_Hive权限控制和超级管理员的实现
Hive权限控制 Hive权限机制: Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 先决条件: 为了使用Hi ...
- 方法级权限控制-基于表达式操作
Spring Security允许我们在定义URL访问或方法访问所应有的权限时使用Spring EL表达式,在定义所需的访问权限时如果对应的表达式返回结果为true则表示拥有对应的权限,反之则无.Sp ...
- 方法级权限控制-@Secured注解使用
@Secured注解 @Secured注解标注的方法进行权限控制的支持,其值默认为disabled. 示例: @Secured("IS_AUTHENTICATED_ANONYMOUSLY&q ...
- 3YAdmin-专注通用权限控制与表单的后台管理系统模板
3YAdmin基于React+Antd构建.GitHub搜索React+Antd+Admin出来的结果没有上百也有几十个,为什么还要写这个东西呢? 一个后台管理系统的核心我认为应该是权限控制,表单以及 ...
- 基于角色-功能-资源的权限控制模型的设计与实现-引子
摘要 本文在RBAC基本思想的基础上,增加资源权限的概念,设计了在企业应用系统中用户权限控制的一种具体的简单实现方法. 关键字 用户权限控制 名词解释 资源权限:资源指的是纳入企业应用的一切需要管理的 ...
- crm---本项目的权限控制模式
一:url权限: 最底层的权限控制,,缺点在与没有预判的机制,造成客户体验下降. 前提: 为controller中的每一个方法(即资源)定义一个资源(Resource)名称,,该 ...
最新文章
- 二、多并发实现接口压力测试
- netframework转core时文件响应流问题
- 基于概率统计分析的应用流特征分析
- asp.net三层架构应用详解【收录】
- Seq(HDU-6672)
- JS导出txt文本文件,Netsuite方案
- Spring boot 日志 Logback
- VC++ 6.0 快捷键
- 操作教程:摄像头通过GB28181协议注册EasyCVR的详细配置
- 快速清理C盘的四个方法
- JSON字符串生成在线生成POJO工具类
- 恒生UFX交易接口基本介绍说明
- 兆,字节,位等单位转换
- MATLAB(3)MATLA 求极限 求积分 求微分 求级数的和
- 【转】关于在.Net开发中使用Sqlite的版本选择问题
- 关于Android开发者的简历
- JLINK仿真器与ST-LINK仿真器的安装与配置.pdf
- strstr函数和strtok函数的使用
- 如何理解vue中的Dep类,太绕了
- 【解决 ipad做电脑副屏镜像的问题】
热门文章
- C# 对象与JSON字符串互相转换的三种方式
- MFC与OpenCv中的图片转换实例
- 在C++中可以用3种方法访问一个字符串
- 微信小程序 滚动选项卡 swiper高度自适应
- base64链接转为地址php,php将图片链接转换为base64编码文件流
- html制作柱状图教程,基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
- mfc140dll 丢失 微软常用运行库_微软常用运行库合集 2020.9月(32amp;64位)
- sqlserver查看用户名密码_php 连接sql server数据库
- qt为窗体部件设置阴影、类似日晕效果
- Android开发之添加QQ群的方法(官方代码)