Terry.Li-彬

虚其心,可解天下之问;专其心,可治天下之学;静其心,可悟天下之理;恒其心,可成天下之业。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  143 随笔 :: 344 文章 :: 130 评论 :: 0 Trackbacks

Ralasafe开源有段时间了,大约有2个月了。根据社区的反馈,我打算围绕Ralasafe最佳实践,书写一系列BLOG。

 

大体内容有:

1, 登录控制: 哪些页面需要登录后才能访问,登录用户名、密码验证,登录转向页面;

2, URL权限控制:哪些页面访问需要进行角色权限验证,怎样验证最简单有效,如何处理验证失败情况;

3, 数据级权限管理方案探讨:选择中间件呢还是框架?

4, Ralasafe体系结构: 用户怎么读取,用户有哪些字段,怎样与应用基础;

5, 数据级查询权限管理: 如何给不同的人分配不同的查询数据权限,返回where条件呢,还是直接返回结果集?

6, 数据级决策权限管理: 如何给不同的人分配不同的数据操作权限,当用户不具备权限怎么办?

7, 其他细小的权限控制: 如下拉框显示内容;按钮、链接是否显示,图片是否显示等。

-------------------------------------------- ------- --------------------------------------

 

今天说的登录控制,内容主要有:哪些页面需要登录控制、登录验证逻辑、登 录后页面转向哪里,以及权限菜单等问题。虽然本系列讲解权限管理,尤其是数据级权限管理。但严格意义来说,登录控制,并不属于权限管理内容。它属于用户身 份认证内容。权限基本都与用户相关,用户首先就涉及到用户名密码验证。所以我们从这里开始说起。

 

需求考察

仔细考察登录控制,无外乎这些需求:

  1. 哪些页面需要登录后才能查看,而且哪些页面还需要进一步验证角色权限;
  2. 登录页面在哪里?
  3. 登录用户名、密码验证;
  4. 登录后转向哪个页面?
分析清楚需求后,我们来考察使用什么方案,以其达到目标:将共用与个性的东西分开,而且尽可能共同,个性的东西尽可能使用配置方式。

解决方案

Ralasafe解决方案:
  1. 登录界面和登录转向后页面,由开发人员编写,这属于个性化内容,有CSS、页面布局等;
  2. 哪些页面需要登录才能查看,可以通过Filter来控制:哪些页面需要控制,使用web.xml里面的url-pattern,是否登录使用Filter验证session;
  3. 哪些页面还需要进行角色权限验证,这个我们拆分出去,做为功能权限验证,以后再谈;
  4. 用户名、密码验证可以共用:就是从request中读取用户名、密码值,或许可能还要对密码进行加密,然后与数据库用户表相关字段进行比对。
  5. 登录后页面转向:通过给session添加一个gotoPage属性,验证成功后转向该页面即可。

实例说明

OK,我们套个实例说话!就拿ralasafe-demo来说,下载地址:http://ralasafe.org/zh/download/download.jsp
ralasafe/demo里面的页面需要登录后才能访问,ralasafe/demo/login.jsp页面是登录页面;ralasafe/demo/main.jsp是登录后,显示功能菜单的页面。

 

配置LoginFilter

我们先将LoginFilter配置到web.xml文件:

 

Xml代码
  1. < filter >   
  2.     <filter-name>ralasafe/LoginFilter</filter-name>  
  3.     <filter-class>org.ralasafe.webFilter.LoginFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>loginPage</param-name>  
  6.         <param-value>/ralasafe/demo/login.jsp</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.         <param-name>uniqueFieldsParams</param-name>  
  10.         <param-value>loginName</param-value>  
  11.     </init-param>  
  12.     <init-param>  
  13.         <param-name>passwordParam</param-name>  
  14.         <param-value>password</param-value>  
  15.     </init-param>  
  16.     <!--init-param>  
  17.         <param-name>encryptMethod</param-name>  
  18.         <param-value>shahex</param-value>  
  19.     </init-param-->  
  20. </ filter >   

 

 这里有几个属性上面没有提到。uniqueFieldsParams表示页面的哪些字段可以唯一确定用户,一般情况下只有一个参数。这里配置是loginName(Login页面的字段input name属性),那么login.jsp里面就有这样的代码:

 

Html代码
  1. < input   name =" < span  style=" color : rgb(255, 0, 0);" > < strong > loginName </ strong > </ span > type = "text"   class = "username" >   

 

 如果需要多个字段确定一个用户,比如需要用户名+机构唯一确定,那么web.xml可以配置成:

 

Xml代码
  1. < init-param >   
  2.     <param-name>uniqueFieldsParams</param-name>  
  3.     <param-value>loginName,<span style="color: rgb(255, 0, 0);"><strong>unitId</strong></span></param-value>  
  4. </ init-param >   

 passwordParam表示页面哪个字段是密码字段;encryptMethod表示密码使用什么加密方法,ralasafe提供了base64,md5hex,shahex加密方法。你也可以自行开发加密方法,详见LoginFilter javadoc

 

哪些页面需要登录验证

我们只要将需要验证的页面,安装该Filter即可。配置web.xml:

 

Xml代码
  1. < filter-mapping >   
  2.     <filter-name>ralasafe/LoginFilter</filter-name>  
  3.     <url-pattern>/ralasafe/demo/*</url-pattern>  
  4. </ filter-mapping >   

表示ralasafe/demo下的所有URL资源都需要经过LoginFilter过滤。

验证逻辑

验证逻辑全部在LoginFilter里面。LoginFilter主要做这些事情:

 

  1. 首先判断客户端是否在请求登录页面,如果是,那么转向登录页面,以免造成死循环
  2. 然后如果是请求登录,那么读取用户名、密码(可能密码还要加密)进行验证;
  3. 如果不是请求登录,那么这时需要查看session用户是否登录了。如果没有登录,那么转到登录页面;如果已经登录继续doChain。
细心的朋友会问,怎样去后台验证用户名密码呢?
Ralasafe是通过配置元数据(详见这里),来告诉系统哪张表是用户表,哪些字段是用户唯一字段(和LoginFilter里里面的uniqueFieldsParams顺序对应上即可,无需名称相同)。
LoginFilter字段指明哪个字段是密码字段,LoginFilter还需要指明和用户表的哪个字段进行比较。也就是userPasswordField参数意义。详见: LoginFilter javadoc

登录页面转向

如果客户端在没有登录的情况下,请求/ralasafe/demo/employMng路径,那么登录成功后,系统最好直接转到该路径。 LoginFilter会将该路径采集下来,以“gotoPage”属性保存到session。登陆成功后,会移除掉该属性(不占用session资源)。

此时,LoginFilter的form action是这么编写的:

 

Html代码
  1. < %  
  2.     String gotoPage = (String) session.getAttribute("gotoPage");  
  3.     if (StringUtil.isEmpty(gotoPage)) {  
  4.         gotoPage = "main.jsp";  
  5.     }  
  6.  %>  
  7. < form   name = ""   action = "<%=gotoPage%>"   method = "post" >   

 

至此,我相信一切你都明白了。 

 

------------------------分隔线----------------------------

毕竟我们搞ralasafe很多年了(04年开始的),所以很难更好地站在使用者角度(虽然,我们在努力,一直在努力),内容肯定有欠缺和错误。欢迎大家提出宝贵建议,欢迎大家努力拍砖!

我们也将继续保持开源,为大家贡献好的软件。也恳请大家支持我们!

 

注:下期讲解 2, URL权限控制:哪些页面访问需要进行角色权限验证,怎样验证最简单有效,如何处理验证失败情况;

ralasafe团队博客在javaeye/baidu/sina等空间,同步发布。ralasafe官方网站: http://www.ralasafe.org/zh

posted on 2010-09-11 11:10 礼物 阅读(834) 评论(1)  编辑  收藏

评论

# 354554 2015-06-30 15:27 3498665
684854986  回复  更多评论
  


只有注册用户登录后才能发表评论。

网站导航: