第二章
登录及
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>
分享到:
相关推荐
BS应用系统中的细粒度权限管理模型.pdf
java的细粒度权限和shiro权限校验 Spring + Struts + hibernate
基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 基于SpringBoot+shiro实现数据库的细粒度动态权限管理系统 项目经过严格测试,确保可以运行!...
【2018hit计算机系统安全】实验二:细粒度权限管理及实现root能力的分发和管理
这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...
权限控制是Web应用项目中比较关键的环节,如果不建立权限管理系统,那么一个非法用户可以轻而易举通过浏览器访问Web应用项目中的所有功能。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已...
Android平台细粒度权限管理系统的研究与实现.pdf
Android平台下细粒度权限管理机制设计与实现.pdf
电信设备-信息系统中细粒度权限管理方法.zip
动态代理加注解实现细粒度的权限拦截,具体到方法
细粒度管理Linux文件系统.pdf
细粒度位置追踪
动态代理加注解实现细粒度的权限管理,具体到方法(前面上传的资源修改)
共包含6大类20个细粒度要素的情感倾向....层次二为细粒度的情感对象,例如“服务”属性中的“服务人员态度”、“排队等候时间”等细粒度要素。每个细粒度要素的情感倾向有四种状态:正向、中性、负向、未提及
简单的权限管理系统,设计人员管理,细粒度的权限管理,项目基于springboot,使用了jwt技术。
使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例
模仿shiro 框架,自己实现的权限管理系统 采用 ssm+自定义标签+自定义注解 来达到细粒度控制权限
使用 Springboot 实现的基于数据库细粒度动态权限管理系统.zip
基于python的细粒度情感分析设计与实现