权限(二)--权限的控制(过滤器与自定义标签)

一、

接着上一篇的说 权限(一)--用户、权限组以及权限的分配

权限的控制分为两块:

1.页面的控制(没用权限的不让他看到页面)

2.过滤控制(就算知道url,没有权限也不让进)

在项目中,都是由一个人来负责权限部分的编写,然后其他人的活中多少会涉及到一些权限相关的。

所以,权限控制的通用性是非常重要的(总不能每次写到就找写权限部分的那个人,问他怎么弄)。

测试demo包:

权限控制Demo

二、过滤器

在访问url之前,进行一次过滤,同时查看当前用户是否有访问该url的权限。

为了保证通用性,这里使用一个map来记录url与权限的映射关系。

当其他开发者编写到需要权限控制的页面时,只需要将页面的url以及对应需要哪种权限的映射对放入到数据库中。

在应用发布的时候,加载映射到内存即可。

在过滤的时候:

1.通过url查看映射表,判断当前url是否需要权限,如果需要,需要什么权限

2.通过查找到的权限,与session中保存的权限比,看session中是否有需要的权限

session的权限查找用的比较多,所以使用HashSet实现O1时间查找。

package com.privilege.filter;

import java.io.IOException;
import java.util.HashSet;

import javax.servlet.Filter;
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;

import com.privilege.utils.PrivilegeUrlMapping;

public class PrivilegeFilter implements Filter {

	private static String CONTEXT_PATH = null;

	@Override
	public void destroy() {

	}

	@SuppressWarnings("unchecked")
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;

		String requestPath = request.getRequestURI();
		String target = requestPath.replace(CONTEXT_PATH, "");

		// 如果不需要权限,放行
		if (!PrivilegeUrlMapping.contains(target)) {
			chain.doFilter(request, response);
			return;
		}

		Object p = request.getSession().getAttribute("privilege");
		// 如果session无记录,直接不给过
		if (p == null) {
			defaultRedirect(response);
			return;
		}
		HashSet<Integer> privleges = (HashSet<Integer>) p;
		// 查找映射关系表
		Integer code = PrivilegeUrlMapping.getPrivilegeCode(target);
		// 查看该用户是否包含此url的权限
		if (privleges.contains(code)) {
			chain.doFilter(request, response);
			return;
		}

		// 权限不足,重定向到登录界面
		defaultRedirect(response);

	}

	private void defaultRedirect(HttpServletResponse response)
			throws IOException {
		response.sendRedirect(CONTEXT_PATH + "/login.jsp");
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		CONTEXT_PATH = config.getServletContext().getContextPath();
	}

}

三、页面处理

同样是为了实现通用,这里使用一个自定义标签

设想是这样的

<p:privilege target="2"></p:privilege>

使用这个一个标签,将需要权限判断的内容放入到其中,然后指定需要哪种权限。

自定义标签java代码:

package com.privilege.tag;

import java.io.IOException;
import java.util.HashSet;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class PrivilegeTag extends BodyTagSupport {

	private Integer target;

	@Override
	public int doEndTag() throws JspException {
		Integer code = getTarget();
		Object p = pageContext.getSession().getAttribute("privilege");
		if (p == null) {
			return SKIP_BODY;
		}
		HashSet<Integer> privilege = (HashSet<Integer>) p;
		//如果session中的privilege含有该权限,则显示其中的内容
		//否则跳过
		if (privilege.contains(code)) {
			try {
				pageContext.getOut().print(bodyContent.getString());
			} catch (IOException e) {
				e.printStackTrace();
			}
			return EVAL_PAGE;
		}
		return SKIP_BODY;
	}

	public Integer getTarget() {
		return target;
	}

	public void setTarget(Integer target) {
		this.target = target;
	}

}

自定义标签配置文件(放在WEB-INF下):

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
	version="2.1">

	<tlib-version>1.2</tlib-version>
	<short-name>p</short-name>
	<uri>http://java.sun.com/jsp/jstl/privilege</uri>

	<tag>
		<name>privilege</name>
		<tag-class>com.privilege.tag.PrivilegeTag</tag-class>
		<body-content>JSP</body-content>
		<attribute>
			<name>target</name>
			<required>yes</required>
		</attribute>
	</tag>

</taglib>

四、jsp页面

1.包含taglib

<%@ taglib prefix="p" uri="http://java.sun.com/jsp/jstl/privilege"%>

2.内容

<body>
	<p:privilege target="1">
		<div>权限1能够看到</div>
		${user.username}
	</p:privilege>

	<p:privilege target="2">
		<div>权限2能够看到</div>
		${user.username}
		</p:privilege>

	<p:privilege target="3">
		<div>权限3能够看到</div>
		${user.username}
	</p:privilege>
</body>

五、测试

好了,亲测好使。。。

下载地址:

权限控制Demo

记得查看readme.txt文件

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 23:00:37

权限(二)--权限的控制(过滤器与自定义标签)的相关文章

Django(自定义过滤器和自定义标签)

模版是一个用django模版语言标记过的python字符串.模版可以包含模版标签和变量. 模版标签是在一个模版里起作用的标记.比如,一个模版标签可以产生控制结构的内容(if或者for),可以获取数据库内容或者访问其它模版标签. 一个标签块被{%%}包围 变量标签被{{}}包围 context是一个传递给模版的key-value对. 模版渲染是通过从context获取值来替换模版中变量并执行所有的模版标签. 创建自定义标签目录 首先在app底下创建一个templatetags目录,添加一下两个.p

Java web自定义标签按钮级别权限控制完美诠释(jplogic 快速开发平台)

接下来跟大家聊聊JavaWeb中权限控制,往大的方向说可以聊聊整合应用系统中的权限控制.在聊权限控制之前先跟大家聊聊RBAC.那么什么是RBAC呢?RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联的,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的

自定义标签实现网站权限的控制

在编写html文档时,有些功能用已有的标签不能完成或是用已有的标签不能很简单的达到用户的要求,这时就需要程序员自己编写相应的标签来完成指定的功能 这里笔者以网站权限的控制来着手讲解自定义标签的实现方法及其好处,希望对喜欢建站的读者有一定的帮助 在网站建设过程中相信很多开发者都会为权限的控制而烦恼,虽然理论上来说,为每一种角色都创建一套网页的想法是可行的,可是这在实际的操作中是难以令人接受的,因为可能两个角色的功能只有细小的差别而却要建立两套页面,这额外的工作量及时间的开销都是开发都不能忍的,而且

自定义标签 + shiro 实现权限细粒度控制

这里我们是使用shiro来实现登录验证,授权等操作,然后利用自定义jsp标签来实现权限菜单的细力度控制.所谓的细粒度控制,就是根据用户登录权限的不同,显示不同的菜单,例如,用户如果有添加用户,修改用户的权限,我们就显示这个俩个菜单,然后我们并不显示删除用户的菜单. 如何自定义jsp标签 1.定义一个权限标签,命名为mytag.tld <?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="

整理一份jsp自定义标签以及权限控制标签

jsp自定义标签使用场景因地制宜,可以实现自定义的标签输出功能也可以实现权限的管理 1:先定义标签类 1-1:页面输出标签 package com.suyin.web.jspsectag; import java.io.IOException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; public cla

权限(二)

本篇阅读目录 一.权限组件 二.动态显示权限菜单(单级菜单) 三.补充知识点 回到顶部 一.权限组件 1.上篇随笔中,我们只是设计好了权限控制的表结构,有三个模型,五张表,两个多对多关系,并且简单实现了对用户的权限控制,我们会发现那样写有一个问题,就是权限控制写死在了项目中,并且没有实现与我们的业务逻辑解耦,当其他项目要使用权限控制时,要再重复写一遍权限控制的代码,因此我们很有必要将权限控制的功能开发成一个组件(可插拔). 组件其实就是一个包,将一个与功能相关的代码关联到一起,当其他项目要使用该

svn(二权限管理)

Subversion权限配置 v svn 仓库权限配置 ? svnserve.conf 定义所有认证和授权政策 ? passwd 存放项目成员帐户信息 ? authz 主要是做复杂的群组权限控制 项目仓库目录下的conf 目录中 F 第一步对svnserve.conf 文件作如下修改,找到以下四行: #anon-access = read #auth-access = write #password-db = passwd #authz-db = authz 将这四行前的“#”号去掉,并修改如下

包和访问权限(二)

1. java的访问权限 2. 软件包的导入 1. java的访问权限 <1> public  公共权限 既可修饰类  又可修饰成员变量和成员函数 不在同一个包, 对其访问时必须是公共类 1 package mirror; 2 3 class Person{ 4 public String name; 5 public void introduce(){ 6 System.out.println("name"); 7 } 8 } package Mirror; class

drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用

三大认证工作原理简介 源码分析: from rest_framework.views import APIView 源码分析入口: 内部的三大认证方法封装: 三大组件的原理分析: 权限六表分析 基于用户权限访问控制的认证(RBAC):Role-Based-Access-Control;基于auth的认证规则(了解). Django框架采用的是RBAC认证规则:通常分为:三表规则.五表规则.Django采用的是六表规则. 三表:用户表.角色表.权限表 五表:用户表.角色表.权限表.用户角色关系表.