WebX框架的页面授权
WebX框架的页面授权
什么是页面授权,简单来说就是对于一个Web应用程序里,哪些页面可以被哪些人在什么情况下访问进行限制。举个简单的例子,有些页面只有用户登录以后才能访问,而另外一些页面无论是否用户登录都能访问。那在这种情况下就需要对页面进行授权管理。
最简单的对页面进行授权管理的方式,就是在每个页面的访问逻辑前都加一段代码去判断是否登录了。如果没有登录就跳转到登录页面,如果登录了就放过。但是这样的检查每个页面都要写一遍太麻烦,即便是携程一个函数或者逻辑,每个地方拷贝一下也是令人崩溃的事情。
当然幸好Java提供了Servlet Filter,使用这个东西会更方便一点。
对于WebX来说,里面对于页面授权的管理提供了一定的支持。尽管不是非常好,但也在一定程度上减少了实现页面授权的实现复杂度。
WebX的页面授权是假定用户实现的Web App使用了多用户以及角色来管理页面的权限。具体的就是有多个用户,每个用户拥有多种角色。可以根据用户来管理页面授权,也可以根据用户对应的角色来管理页面授权。
要使用WebX的页面授权机制,简单的分为如下两个步骤:
1.实现在一个处理回调类,处理对于页面访问授权(WebX会回调对应的方法)。
2.在项目对应的模块的webx-XX.xml中添加,对应的规则。
我们首先来说明一下怎么去实现这个回调类。该类必须满足如下两个条件:
1.继承自 com.alibaba.citrus.springext.support.BeanSupport 类。
2.且必须同时实现com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback接口。
3.必须自定义一个数据类,作为泛型参数。该参数由该类自己构造,并在构造完成以后,交给WebX(构造改参数的对象可以在任何地方,但是返回该对象给WebX是在onStart方法),在WebX回调该类的方法的时候,用作参数。其作用在于记录用户的回调类需要的一些状态信息。
下面以一个具体的例子来看一下,实现。
public class PageAccessCheck extends BeanSupport implements Callback<PageAccessCheck.Status> {
private static final Logger log = LoggerFactory.getLogger(PageAccessCheck.class);
private String userName;
/* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#getUserName(java.lang.Object)
*/
@Override
public String getUserName(Status status) {
return userName;
} /* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#getRoleNames(java.lang.Object)
*/
@Override
public String[] getRoleNames(Status status) {
if (userName != null) {
return new String[] { "admin"};
}
return null;
} /* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#getActions(java.lang.Object)
*/
@Override
public String[] getActions(Status status) {
// TODO Auto-generated method stub
return null;
} /* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#onStart(com.alibaba.citrus.turbine.TurbineRunData)
*/
@Override
public Status onStart(TurbineRunData rundata) throws Exception {
HttpSession session = rundata.getRequest().getSession();
userName = (String) session.getAttribute("userName");
return new Status(rundata);
} /* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#onAllow(java.lang.Object)
*/
@Override
public void onAllow(Status status) throws Exception {
// TODO Auto-generated method stub
log.debug("Acess allowed!");
} /* (non-Javadoc)
* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#onDeny(java.lang.Object)
*/
@Override
public void onDeny(Status status) throws Exception {
// TODO Auto-generated method stub
log.error("Acess Denied!");
} static class Status {
private final TurbineRunData rundata; public Status(TurbineRunData rundata) {
this.rundata = rundata;
}
} }
这是我的一个简单的实现,类的名称可以按照自己的需要来命名。在访问的页面被拒绝的时候,打印错误日志信息。在通过授权验证的时候,同样打印日志信息。
WebX再每次执行页面授权验证的时候,会先构造一个这个PageAccessCheck对象,并调用对象的onStart方法。onStart方法的返回值被WebX持有,作为回调onAllow和onDeny及其他几个方法的参数。
在这个简单的实现里,AccessCheck.Status仅仅是作为了TurbineRunData的一个wrapper对象。如果你有任何需要的其他信息,也可以放入AccessCheck.Status类。
假设你需要在页面被拒绝访问的时候,不但要记录日志,还要跳转到某个特定的页面上,那就在onDeny里面添加自己的逻辑。
除了onAllow跟onDeny方法意外,还有几个方法,需要关注一下:
1. getUserName,该方法由WebX调用,获得当前登录的用户名。如果没有用户登录,可以返回null。那么WebX就会认为该用户是匿名用户。
2. getRoleNames,该方法由WebX调用,获得当前登录的用户的角色。
WebX调用上述两个方法,获取当前用户的名称及角色,然后根据对应模块下的访问规则,来决定对应的页面到底是否可以访问,如果可以访问,就回调onAllow方法,否则回调onDeny方法。
上面的回调类实现以后,怎么配置让WebX项目使用呢?
1.在项目对应的模块的pipeline.xml中增加一个对应的valve。大多数情况下,这些模块都是公用WEB-INF/common/pipeline.xml文件。如果该模块使用自己的pipeline.xml定义。就增加到自己的pipeline.xml中。
具体增加的语句就是:
<pl-valves:pageAuthorization callbackClass="PageAccessCheck" />
注意:该条语句一般位于<pl-valves:checkCsrfToken />之后,<pl-valves:loop>语句之前。
2.在页面对应模块的配置文件(比如模块叫XX,那么对应的文件为webx-XX.xml)中增加如下配置(确保在标签<beans:beans>与</beans:beans>之间):
<services:page-authorization default="deny">
<match target="/input">
<grant user="anonymous">
<deny>*</deny>
</grant>
</match>
<match target="/input">
<grant role="admin">
<allow>*</allow>
</grant>
</match>
<match target="/login">
<grant user="anonymous">
<allow>*</allow>
</grant>
</match>
<match target="/">
<grant user="anonymous, *">
<allow>*</allow>
</grant>
</match>
</services:page-authorization>
这里的配置,是我的应用的,请根据自己的实际需要调整规则。每条规则对应一条match标签及内容。
这里先以我的上述规则作为例子,来解释一下规则的语法。
每条规则都以match标签来代表,match标签的target属性是用来匹配具体的访问路径的,这个路径是从Web App的context path之后开始的。
规则的具体使用,描述起来比较麻烦。就以上述三条规则来说明一下,理解了以后,应该可以灵活使用满足自己的需求了。
先看一下<services:page-authorization default="deny">这句话,这句话的意思是,本模块里面的页面默认全都是不允许访问的。除非是有具体的规则允许,这是最严格,也是最安全的配置。
来看第一条规则,该规则,说的是,对于/input这个页面(URL),对于anonymous用户是拒绝的。还记得我们前面提及的getUserName方法吗?当该方法返回null值的时候,WebX就使用的是 anonymous用户。实际该条规则是冗余的,不需要的。为什么呢?因为我们的默认规则是deny,所以所有deny的规则都是多余的,和不必要的。
来看第二条规则,该规则是说对于/input,对于所有角色为admin的用户,都是允许的。
第三条规则时说,对于/login,对于匿名用户是允许的。为什么呢?如果匿名用户不允许访问login,那么匿名用户就永远没有机会变成非匿名用户了. :)
第四条规则,是说对于该应用下的所有页面,对于匿名用户和其他用户,都是允许的。这似乎是跟default="deny"是矛盾的?确实是矛盾的,写在这里仅仅是为了演示规则的写法。
那么你可能有个疑问,就是如果两条规则矛盾的时候,会发生什么?WebX来说,如果某个页面(URL)同时满足多条规则,那么deny的规则优先执行。
WebX框架的页面授权的更多相关文章
- 深入webx框架(li)
目录 1.Webx简介 2.创建webx应用 一.Webx简介 Webx本质上就是一个Web框架,它建立在Java Servlet API基础之上.上图所示是webx的架构图.webx本身类似于s ...
- 我的WebX框架学习总结与心得分享
最近学习了webx框架, 利用博客园跟大家分享一下自己的学习心得; 周建旭 2014-08-21 网上关于webx的资料少的可怜, 怎么办? 这种情况下不用去求助别人求人只会耽误时间, 不用畏惧; ...
- Webx框架自带的petstore
Webx框架:http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后:mvn jetty:run ...
- WebX框架学习笔记之一
Webx是什么? Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx的发展历史 2001年,阿里巴巴内 ...
- Webx框架:Spring Schema 和 Spring Ext
webx诞生的原因是当时市面上没有好用的web框架.如今的Web框架有非常多.然后它们背后的思想都是相似的,并且越来越趋同. Spring Schema 在传统的spring中,配置bean时须要手动 ...
- 移动端--用PX为单位+JS框架 实现页面布局
一:大家先下载metahandler.js 二:准备一个用px实现的移动页面(宽度固定死的页面),引入metahandler.js框架 1.视口设置 width=640,是根据psd图来设置,有多宽设 ...
- java 获取微信 页面授权 获取用户openid
先调用微信的地址 跳转https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4b4009c4fce00e0c&redirect ...
- js实现frame框架部分页面的刷新
一.先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做. frame.html 由上(top.html)下(bottom ...
- ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可
ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可
随机推荐
- JVM知识(三):内存模型和可见性
这篇文章我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况.来聊聊java线程对一个变量的更新怎么通知另一个线程,及volatile的作用和 ...
- MongoDB学习笔记(一)——Windows 下安装MongoDB
首先从官网下载mongodb的windows安装包,根据自己系统类型选择32位或者64位版本安装即可,然后根据提示一路下一步即可安装完成.如果没有修改安装目录会默认安装在C:\Program Fil ...
- oracle 闪回功能详解
Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前 ...
- 第一章:了解SQL_数据库基础
什么是数据库(database): 数据库(database)是保存有组织的数据的容器(通常是一个文件或一组文件).数据库是一种以某种有组织的方式存储的数据集合. 表(table): 表(tabl ...
- 由于使用JDBC ResultSet的滚动功能而导致的内存溢出
前天一去公司,老大说,服务器全挂了! 最后排查了半天,结论是内存溢出! 在WAS的DUMP日志中,看得我头晕眼花,终于找到了罪魁祸首,原来是有同事写代码的时候使用了可滚动的结果集导致内存溢出. 什么是 ...
- 最大公约数(GCD)与最小公倍数(LCM)的计算
给出两个数a.b,求最大公约数(GCD)与最小公倍数(LCM) 一.最大公约数(GCD) 最大公约数的递归: * 1.若a可以整除b,则最大公约数是b * 2.如果1不成立,最大公约数便是b ...
- Maven构建时跳过部分测试
当遇到以下场景: 其他人写的单元测试影响统计结果 一些需要调用外部接口的测试暂不运行 需要在非本机环境上运行一些不回滚的单元测试 则有必要选择以下方法跳过部分测试. 在测试用例前加上注解 @Ignor ...
- vs2012配置
ogre1.9 http://m.blog.csdn.net/blog/u013025310/20869871 http://www.cnblogs.com/zhouxin/p/4258849.htm ...
- 分析 org.hibernate.HibernateException: No Session found for current thread
/** * * org.hibernate.HibernateException: No Session found for current thread * 分析:ge ...
- Windows程序设计(Charles Petzold)HELLOWIN程序实现
/*-------------------------------------------------------------- HELLOWIN.C--DisPlays "Hello, W ...