第二章
登录及
URL拦截
本章讲解如何控制用户登录,如何拦截
URL
进行权限验证。
通常,项目有这样的需求:
-
某些页面没有登录可以查看;
-
某些页面必须登录才能查看,如果没有登录,转移到登录页面,成功登录后再转移回来;
-
某些页面必须验证当前登录用户是否具有请求该页面的权限,如果没有转移到权限不足提示界面。
解决思路
控制登录
控制用户登录,采用
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>
分享到:
相关推荐
在Java开发中,细粒度权限管理是一种重要的安全机制,它允许系统对用户访问资源进行精确控制,确保每个用户只能操作他们被授权的部分。Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、...
总之,基于RBAC的细粒度权限控制提供了一种有效且灵活的方式来管理Web应用的访问权限。它通过角色将用户和权限关联,减少了管理开销,增强了系统的安全性和适应性。随着企业需求的不断变化,RBAC模型已成为现代权限...
权限控制之粗粒度与细粒度概念及实现简单介绍 权限控制是信息安全中的一种重要机制,主要用于控制用户对资源的访问权限。权限控制可以分为两种类型:粗粒度权限控制和细粒度权限控制。 粗粒度权限控制是指对资源...
与粗粒度权限管理相比,细粒度权限管理提供了更加灵活和细致的权限控制方式。这意味着系统可以对应用请求的权限进行更细粒度的管理和分析,从而让用户在授权时可以选择性地赋予应用权限,而不是全有或全无的方式。...
基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...
在信息系统中,细粒度权限管理(Fine-Grained Access Control, FGAC)是一种重要的安全策略,它允许系统管理员对用户访问资源的权限进行精确控制。这种方法与传统的粗粒度权限管理不同,后者通常只设置如“读取”、...
随着智能设备的普及和Android系统的广泛使用,这种粗粒度的权限管理机制的局限性逐渐显现,因此,细粒度权限管理机制的设计与实现显得尤为重要。 细粒度权限管理机制旨在解决粗粒度机制中的问题,它允许应用程序在...
### 细粒度权限管理与Root能力的分发和管理 #### 实验背景与目标 在计算机系统安全领域,权限管理是一项重要的技术措施,用于控制用户对于系统资源的访问级别。其中,细粒度权限管理和root能力的有效管理是确保...
这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...
通过拦截请求,我们可以对用户的操作进行细粒度的控制,确保系统安全的同时,提供了良好的用户体验。然而,这种方案也有其局限性,如权限的静态性和无法实时响应权限变化。因此,在实际应用中,需要根据项目需求选择...
AppBoxPro是一个强大的细粒度通用权限管理框架,它的核心目标是为企业级应用提供高效、安全的用户权限控制方案。该框架充分利用了FineUI库,一个用于构建Web应用的前端组件库,为开发者提供了丰富的界面元素和交互...
在IT行业中,权限管理是系统安全的重要组成部分,尤其在企业级应用中,对用户操作进行细粒度控制显得尤为重要。动态代理与注解的结合,为实现这种细粒度的权限管理提供了一种灵活且高效的方法。下面我们将深入探讨这...
细粒度权限管理是一种先进的策略,它允许管理员对用户访问系统资源的权限进行更精确的控制,而不是简单的“允许”或“禁止”。本资源通过动态代理和注解技术实现了一种细粒度的权限管理方案,具体到每个方法的级别,...
【细粒度位置追踪】是指在提供位置服务的过程中,对用户位置信息进行高度精确和细化的管理和保护。这种追踪方式通常涉及到移动设备,如智能手机,它们利用GPS或其他定位技术获取并分享用户的位置信息。然而,这种...
在本实例中,我们将探讨如何使用SpringBoot框架与Apache Shiro安全库来构建一个基于数据库的细粒度动态权限管理系统。这个系统允许管理员在数据库中动态管理用户、角色及权限,实现灵活的角色分配和权限控制。 **...
【作品名称】:基于python实现的细粒度情感分析:细粒度情感分析接口 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...
在Linux操作系统中,文件系统的细粒度管理是确保系统安全性和用户隐私的关键环节。传统的Linux文件系统访问控制机制基于UGO(用户-用户组-其他用户)模型,这种模型简单易懂,但有时不能满足复杂的权限管理需求。从...
共包含6大类20个细粒度要素的情感倾向....层次二为细粒度的情感对象,例如“服务”属性中的“服务人员态度”、“排队等候时间”等细粒度要素。每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及.