`
metadmin
  • 浏览: 168385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

《玩转细粒度权限管理》 二,登录及URL拦截

阅读更多

 

第二章 登录及 URL拦截

 

 

本章讲解如何控制用户登录,如何拦截 URL 进行权限验证。

 

通常,项目有这样的需求:

 

  1. 某些页面没有登录可以查看;
  2. 某些页面必须登录才能查看,如果没有登录,转移到登录页面,成功登录后再转移回来;
  3. 某些页面必须验证当前登录用户是否具有请求该页面的权限,如果没有转移到权限不足提示界面。

 

解决思路

控制登录

控制用户登录,采用 Filter 机制,不妨给该 Filter 起名为 LoginFilter

怎样控制哪些页面验证是否登录,哪些又不需要呢?配置 web.xml filter 元素的 url-pattern 属性就可以了。

如:

<filter-mapping>
              <filter-name>LoginFilter</filter-name>
              <url-pattern>/secretDir/*</url-pattern>
</filter-mapping>

<filter-mapping>
              <filter-name>LoginFilter</filter-name>
              <url-pattern>/anotherDir/secretDir/*</url-pattern>
</filter-mapping>
 

 

 

LoginFilter 检查 session 是否有用户,如果没有转移到登录页面;否则继续执行。

伪代码如下:

if( session.getAttribute( “user” )==null ) {
       // 将用户期望请求页面保存到session,供用户登录成功后,自动跳转使用
       String requestUrl=…;
       session.setAttribute( “requestUrl”, requestUrl ); 

       // 转移到登录界面
       redirect( loginPage, request, response );
       return;
}

filter.doChain( request, response );
 

 

 

LoginFilter 还可以更进一步,处理用户提交用户名和密码后验证。只要告诉 LoginFilter 用户名是哪个 parameter name ,密码是哪个 parameter name ,密码采用了什么加密算法,就可以了。

伪代码如下:

String username=request.getParameter( usernameParameterName );
String password=request.getParameter( passwordParameterName );
String secretPassword=encrypt(encryptMethod, password );
 

User user=userManager.checkUser( username, secretPassword );
if( user==null ) {
       // 验证不通过,继续转移到登录界面
       redirect( loginPage, request, response );
} else {
       // 验证通过,将用户保存到session,然后继续处理
       session.removeAttribute( “requestUrl” );
       session.setAttribute( “user”, user );
       filter.doChain( request, response );
}
 

 

 

细心的朋友,会问转移到原来期望请求的页面,怎么没有看到逻辑呢?

是的,可以在该 filter 里面 redirect 。但我更倾向于在登录界面的 action 做处理。伪代码如下:

<%
String url=defaultLoginPage;
String requestUrl= (String)session.getAttribute( “requestUrl” );
if(requestUrl!=null ) {
	url= requestUrl;
}
%>
<form method=”post” action=”<%=url%>”>
…
</form>
 

 

拦截 url 做权限判断

对于 web 系统,权限表有这么几个字段:标识、名称、描述、对应 url

那么对于 url 请求,可以在权限表进行查找,查看该 url 是否有个对应的权限。如果有,说明该 url 需要具有没个权限才能访问,那么通过 RBAC 算法进行判断即可。如果在权限表没有找到对应记录,说明该 url 不需要进行权限验证。

 

该需求比较简单,也可以采用 Filter 机制,不妨取名 UrlAclFilter

 

唯一需要注意的地方是:权限表对应的 url 可能带有参数。比如 customreManager?op=add 是增加客户权限, customerManager?op=delete 是删除客户权限。

 

伪代码如下:

if( needPrivilegeCheck( request ) ) {
	// 需要做权限判断
	if( session.getAttribute( “user” ) ==null ) {
		// 用户还没有登录,转移到登录界面
		redirect( loginPage, request, response );
		return;
	} else {
		if( userManager.hasPrivilege( user, privilegeId ) ) {
			filter.doChain( request, response );
			return;
		} else {
			redirect( forbiddenHintPage, request, response );
			return;
		}
	}
}
 

 

基础数据库表

用户信息表,保存用户信息还有密码等,有的系统会对密码进行加密保存到数据库,而不是以明文的形式保存到数据库。

 

权限表,该表基本有这么几个字段:标识、名称、描述、指向 url target target 表示点击该 Url 时在那个窗口显示。标识为主键。

比如下图所示 frameset ,权限菜单 target 属性应该是: MAIN

角色表,该表字段:标识、名称、描述;标识为主键。

权限-角色关系表,该表有字段:角色标识、权限标识;角色标识和权限标识为复合主键。

用户-角色关系表,该表有字段:用户标识、角色标识;用户标识和角色标识为复合主键。

 

如果使用 Metadmin

使用 Metadmin ,只要在 web.xml 里面,配置 LoginFilter UrlAclFilter 即可。

下面就是一个示例配置,对 metadmin/demo 目录进行登录和 url 拦截权限验证,登录页面是 metadmin/demo/login.jsp 页面。

具体参数意义可查看 JAVADOC http://www.metadmin.com/doc/javadoc/index.html LoginFilter UrlAclFilter

 

配置示例:

       <filter>
		<filter-name>metadmin/LoginFilter</filter-name>
		<filter-class>org.back.webFilter.LoginFilter</filter-class>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/metadmin/demo/login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>uniqueFieldsParams</param-name>
			<param-value>loginName</param-value>
		</init-param>
		<init-param>
			<param-name>passwordParam</param-name>
			<param-value>password</param-value>
		</init-param>
		<!--init-param>
			<param-name>encryptMethod</param-name>
			<param-value>shahex</param-value>
		</init-param-->
	</filter>
	<filter>
		<filter-name>metadmin/UrlAclFilter</filter-name>
		<filter-class>org.back.webFilter.UrlAclFilter</filter-class>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/metadmin/demo/login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>denyPage</param-name>
			<param-value>/metadmin/demo/noPrivilege.jsp</param-value>
		</init-param>
	</filter>

      <filter-mapping>
		<filter-name>metadmin/LoginFilter</filter-name>
		<url-pattern>/metadmin/demo/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>metadmin/UrlAclFilter</filter-name>
		<url-pattern>/metadmin/demo/*</url-pattern>
	</filter-mapping>
 

 

 

7
0
分享到:
评论
2 楼 metadmin 2009-06-18  
风格无国界。呵呵
1 楼 whaosoft 2009-06-18  
Metadmin 你写的啊~~ 我还以为是老外的了

相关推荐

    java的细粒度权限和shiro权限校验 ssh

    在Java开发中,细粒度权限管理是一种重要的安全机制,它允许系统对用户访问资源进行精确控制,确保每个用户只能操作他们被授权的部分。Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、...

    基于RBAC模型的细粒度权限控制

    总之,基于RBAC的细粒度权限控制提供了一种有效且灵活的方式来管理Web应用的访问权限。它通过角色将用户和权限关联,减少了管理开销,增强了系统的安全性和适应性。随着企业需求的不断变化,RBAC模型已成为现代权限...

    权限控制之粗粒度与细粒度概念及实现简单介绍

    权限控制之粗粒度与细粒度概念及实现简单介绍 权限控制是信息安全中的一种重要机制,主要用于控制用户对资源的访问权限。权限控制可以分为两种类型:粗粒度权限控制和细粒度权限控制。 粗粒度权限控制是指对资源...

    Android平台细粒度权限管理系统的研究与实现.pdf

    与粗粒度权限管理相比,细粒度权限管理提供了更加灵活和细致的权限控制方式。这意味着系统可以对应用请求的权限进行更细粒度的管理和分析,从而让用户在授权时可以选择性地赋予应用权限,而不是全有或全无的方式。...

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统

    基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...

    电信设备-信息系统中细粒度权限管理方法.zip

    在信息系统中,细粒度权限管理(Fine-Grained Access Control, FGAC)是一种重要的安全策略,它允许系统管理员对用户访问资源的权限进行精确控制。这种方法与传统的粗粒度权限管理不同,后者通常只设置如“读取”、...

    Android平台下细粒度权限管理机制设计与实现.pdf

    随着智能设备的普及和Android系统的广泛使用,这种粗粒度的权限管理机制的局限性逐渐显现,因此,细粒度权限管理机制的设计与实现显得尤为重要。 细粒度权限管理机制旨在解决粗粒度机制中的问题,它允许应用程序在...

    【2018hit计算机系统安全】实验二:细粒度权限管理及实现root能力的分发和管理

    ### 细粒度权限管理与Root能力的分发和管理 #### 实验背景与目标 在计算机系统安全领域,权限管理是一项重要的技术措施,用于控制用户对于系统资源的访问级别。其中,细粒度权限管理和root能力的有效管理是确保...

    基于Spring Security的细粒度权限管理系统设计源码

    这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...

    拦截器实现权限管理

    通过拦截请求,我们可以对用户的操作进行细粒度的控制,确保系统安全的同时,提供了良好的用户体验。然而,这种方案也有其局限性,如权限的静态性和无法实时响应权限变化。因此,在实际应用中,需要根据项目需求选择...

    AppBoxPro细粒度通用权限管理框架源码

    AppBoxPro是一个强大的细粒度通用权限管理框架,它的核心目标是为企业级应用提供高效、安全的用户权限控制方案。该框架充分利用了FineUI库,一个用于构建Web应用的前端组件库,为开发者提供了丰富的界面元素和交互...

    动态代理加注解实现细粒度的权限管理,具体到方法

    在IT行业中,权限管理是系统安全的重要组成部分,尤其在企业级应用中,对用户操作进行细粒度控制显得尤为重要。动态代理与注解的结合,为实现这种细粒度的权限管理提供了一种灵活且高效的方法。下面我们将深入探讨这...

    动态代理加注解实现细粒度的权限管理,具体到方法(前面上传的资源修改)

    细粒度权限管理是一种先进的策略,它允许管理员对用户访问系统资源的权限进行更精确的控制,而不是简单的“允许”或“禁止”。本资源通过动态代理和注解技术实现了一种细粒度的权限管理方案,具体到每个方法的级别,...

    细粒度位置追踪

    【细粒度位置追踪】是指在提供位置服务的过程中,对用户位置信息进行高度精确和细化的管理和保护。这种追踪方式通常涉及到移动设备,如智能手机,它们利用GPS或其他定位技术获取并分享用户的位置信息。然而,这种...

    使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例.zip

    在本实例中,我们将探讨如何使用SpringBoot框架与Apache Shiro安全库来构建一个基于数据库的细粒度动态权限管理系统。这个系统允许管理员在数据库中动态管理用户、角色及权限,实现灵活的角色分配和权限控制。 **...

    基于python实现的细粒度情感分析:细粒度情感分析接口

    【作品名称】:基于python实现的细粒度情感分析:细粒度情感分析接口 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...

    细粒度管理Linux文件系统.pdf

    在Linux操作系统中,文件系统的细粒度管理是确保系统安全性和用户隐私的关键环节。传统的Linux文件系统访问控制机制基于UGO(用户-用户组-其他用户)模型,这种模型简单易懂,但有时不能满足复杂的权限管理需求。从...

    细粒度用户评论情感分析数据集(2018-AI-challenger)

    共包含6大类20个细粒度要素的情感倾向....层次二为细粒度的情感对象,例如“服务”属性中的“服务人员态度”、“排队等候时间”等细粒度要素。每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及.

Global site tag (gtag.js) - Google Analytics