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)*/@Overridepublic String getUserName(Status status) {return userName;}/* (non-Javadoc)* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#getRoleNames(java.lang.Object)*/@Overridepublic 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)*/@Overridepublic String[] getActions(Status status) {// TODO Auto-generated method stubreturn null;}/* (non-Javadoc)* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#onStart(com.alibaba.citrus.turbine.TurbineRunData)*/@Overridepublic 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)*/@Overridepublic void onAllow(Status status) throws Exception {// TODO Auto-generated method stublog.debug("Acess allowed!");}/* (non-Javadoc)* @see com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.Callback#onDeny(java.lang.Object)*/@Overridepublic void onDeny(Status status) throws Exception {// TODO Auto-generated method stublog.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的规则优先执行。

转载于:https://www.cnblogs.com/jizhao/p/4636296.html

WebX框架的页面授权相关推荐

  1. Webx框架:Spring Schema 和 Spring Ext

    webx诞生的原因是当时市面上没有好用的web框架.如今的Web框架有非常多.然后它们背后的思想都是相似的,并且越来越趋同. Spring Schema 在传统的spring中,配置bean时须要手动 ...

  2. webx 框架入门一

    来阿里实习一个多月了,被拉着直接上新项目.由于新项目要使用webx,webx框架是淘宝的框架,比较厚重又复杂,但是性能毋庸置疑(毕竟每年双十一都挺过来了).由于webx文档较少,基本都是阿里内部使用. ...

  3. 问题解决10使用带有框架的页面跳转到登录页面时,登录页面只显示在子框架中,未能铺满整个浏览器--解决方案如下:...

    问题描述: 使用带有框架的页面跳转到登录页面时,登录页面只显示在子框架中,未能铺满整个浏览器,例如: 当登录信息过期时,点击左边的菜单栏会让登录页面显示在右边的框架中,而不能铺满整个浏览器 解决方案: ...

  4. 开发无框架单页面应用 — 老码农的祖传秘方

    什么是单页面应用(SPA)? 维基百科上的描述是这样的: JavaScript 1 2 3 "A single-page application (SPA), is a web applic ...

  5. php thinkphp重定向,ThinkPHP框架让页面重定向方法总结

    这次给大家带来ThinkPHP框架让页面重定向方法总结,ThinkPHP框架让页面重定向方法的注意事项有哪些,下面就是实战案例,一起来看一下. ThinkPHP redirect 方法 ThinkPH ...

  6. 使用 JS刷新框架子页面

    转自: http://hi.baidu.com/javajavajava/blog 先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来 ...

  7. ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可...

    ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可 转载于:https://www.cnblogs.com/oymx/p/3976392. ...

  8. Javascript 刷新框架及页面的方法汇总(转)

    一.刷新框架 先来看一个简单的例子: 下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做. frame.html 由上(top.html)下(b ...

  9. 微信公共号系列---快速整合微信多端页面授权之单点登录

    本人从事互联网项目java开发五年,会java,微信公共号开发,python,nodejs,爬虫等技术,对发票项目很熟悉,如果想交一个朋友请加QQ技术交流群@群主吧:131831533 .本文章来源于 ...

最新文章

  1. 读写分离原来这么简单,一个小注解就够了
  2. 赛道公布之后,让我们一起DISS组委会
  3. Java / 关键字
  4. python time模块详解
  5. 计算机网络结构有哪些,计算机网络主要拓扑结构有哪些
  6. 后台通过request.setAttribute向前台传值,前台如何去获取其中的对象或属性值
  7. Linux无线网络设置(wpa_supplicant的使用)
  8. 50道 JavaScript 经典面试题汇总篇
  9. c语言删掉注释,c语言删除注释
  10. SpringBoot2 整合JTA组件,多数据源事务管理
  11. AI(3)--- 机器学习常见的七个步骤
  12. 推荐一些高质量的自学网站
  13. 阿里云 蚂蚁支付宝 钉钉 c++ 面经
  14. 高数——八种求极限方法总结
  15. 新闻发布系统类图_信息系统项目管理师快速记忆口诀
  16. python实用【大技巧】之Python手把手实现远程控制桌面
  17. Python准备篇:第三方库管理
  18. win10动态壁纸怎么设置_教程丨WIN10系统下设置固定IP或动态IP
  19. xml 硕正报表_硕正控件学习记录
  20. thinkadmin中日期的使用

热门文章

  1. linux c语言 udp 接收和发送数据用同一个端口_【Python学习笔记】80、UDP编程
  2. java 表达式2004的值_javaSE习题 第三章 运算符、表达式和语句
  3. 外接鼠标键盘无反应处理
  4. 使用Jackson解析JSON
  5. spring如何下载源码和jar包
  6. PN结空间电荷区形成原理
  7. 加密芯片算法移植方案的优点
  8. 中国团队屠榜:COCOMapillary挑战赛包揽全部冠军
  9. Emgu-WPF 激光雷达研究-移动物体跟踪2
  10. redis的数据持久化方案