-------------------------------------------- 总大纲 --------------------------------------
Ralasafe开源有段时间了,大约有2个月了。根据社区的反馈,我打算围绕Ralasafe最佳实践,书写一系列BLOG。
大体内容有:
1, 登录控制: 哪些页面需要登录后才能访问,登录用户名、密码验证,登录转向页面;
2, URL权限控制:哪些页面访问需要进行角色权限验证,怎样验证最简单有效,如何处理验证失败情况;
3, 数据级权限管理方案探讨:选择中间件呢还是框架?
4, Ralasafe体系结构: 用户怎么读取,用户有哪些字段,怎样与应用基础;
5, 数据级查询权限管理: 如何给不同的人分配不同的查询数据权限,返回where条件呢,还是直接返回结果集?
6, 数据级决策权限管理: 如何给不同的人分配不同的数据操作权限,当用户不具备权限怎么办?
7, 其他细小的权限控制: 如下拉框显示内容;按钮、链接是否显示,图片是否显示等。
-------------------------------------------- ------- --------------------------------------
今天说的登录控制,内容主要有:哪些页面需要登录控制、登录验证逻辑、登录后页面转向哪里,以及权限菜单等问题。虽然本系列讲解权限管理,尤其是数据级权限管理。但严格意义来说,登录控制,并不属于权限管理内容。它属于用户身份认证内容。权限基本都与用户相关,用户首先就涉及到用户名密码验证。所以我们从这里开始说起。
需求考察
仔细考察登录控制,无外乎这些需求:
- 哪些页面需要登录后才能查看,而且哪些页面还需要进一步验证角色权限;
- 登录页面在哪里?
- 登录用户名、密码验证;
- 登录后转向哪个页面?
分析清楚需求后,我们来考察使用什么方案,以其达到目标:将共用与个性的东西分开,而且尽可能共同,个性的东西尽可能使用配置方式。
解决方案
- 登录界面和登录转向后页面,由开发人员编写,这属于个性化内容,有CSS、页面布局等;
- 哪些页面需要登录才能查看,可以通过Filter来控制:哪些页面需要控制,使用web.xml里面的url-pattern,是否登录使用Filter验证session;
- 哪些页面还需要进行角色权限验证,这个我们拆分出去,做为功能权限验证,以后再谈;
- 用户名、密码验证可以共用:就是从request中读取用户名、密码值,或许可能还要对密码进行加密,然后与数据库用户表相关字段进行比对。
- 登录后页面转向:通过给session添加一个gotoPage属性,验证成功后转向该页面即可。
实例说明
ralasafe/demo里面的页面需要登录后才能访问,ralasafe/demo/login.jsp页面是登录页面;ralasafe/demo/main.jsp是登录后,显示功能菜单的页面。
配置LoginFilter
我们先将LoginFilter配置到web.xml文件:
<filter>
<filter-name>ralasafe/LoginFilter</filter-name>
<filter-class>org.ralasafe.webFilter.LoginFilter</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/ralasafe/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>
这里有几个属性上面没有提到。uniqueFieldsParams表示页面的哪些字段可以唯一确定用户,一般情况下只有一个参数。这里配置是loginName(Login页面的字段input name属性),那么login.jsp里面就有这样的代码:
<input name="loginName" type="text" class="username">
如果需要多个字段确定一个用户,比如需要用户名+机构唯一确定,那么web.xml可以配置成:
<init-param>
<param-name>uniqueFieldsParams</param-name>
<param-value>loginName,unitId</param-value>
</init-param>
passwordParam表示页面哪个字段是密码字段;encryptMethod表示密码使用什么加密方法,ralasafe提供了base64,md5hex,shahex加密方法。你也可以自行开发加密方法,详见LoginFilter javadoc。
哪些页面需要登录验证
我们只要将需要验证的页面,安装该Filter即可。配置web.xml:
<filter-mapping>
<filter-name>ralasafe/LoginFilter</filter-name>
<url-pattern>/ralasafe/demo/*</url-pattern>
</filter-mapping>
表示ralasafe/demo下的所有URL资源都需要经过LoginFilter过滤。
验证逻辑
验证逻辑全部在LoginFilter里面。LoginFilter主要做这些事情:
- 首先判断客户端是否在请求登录页面,如果是,那么转向登录页面,以免造成死循环;
- 然后如果是请求登录,那么读取用户名、密码(可能密码还要加密)进行验证;
- 如果不是请求登录,那么这时需要查看session用户是否登录了。如果没有登录,那么转到登录页面;如果已经登录继续doChain。
细心的朋友会问,怎样去后台验证用户名密码呢?
Ralasafe是通过配置元数据(
详见这里),来告诉系统哪张表是用户表,哪些字段是用户唯一字段(和LoginFilter里里面的
uniqueFieldsParams顺序对应上即可,无需名称相同)。
LoginFilter字段指明哪个字段是密码字段,LoginFilter还需要指明和用户表的哪个字段进行比较。也就是userPasswordField参数意义。详见:LoginFilter javadoc。
登录页面转向
如果客户端在没有登录的情况下,请求/ralasafe/demo/employMng路径,那么登录成功后,系统最好直接转到该路径。LoginFilter会将该路径采集下来,以“gotoPage”属性保存到session。登陆成功后,会移除掉该属性(不占用session资源)。
此时,LoginFilter的form action是这么编写的:
<%
String gotoPage = (String) session.getAttribute("gotoPage");
if (StringUtil.isEmpty(gotoPage)) {
gotoPage = "main.jsp";
}
%>
<form name="" action="<%=gotoPage%>" method="post">
至此,我相信一切你都明白了。
------------------------分隔线----------------------------
毕竟我们搞ralasafe很多年了(04年开始的),所以很难更好地站在使用者角度(虽然,我们在努力,一直在努力),内容肯定有欠缺和错误。欢迎大家提出宝贵建议,欢迎大家努力拍砖!
我们也将继续保持开源,为大家贡献好的软件。也恳请大家支持我们!
注:下期讲解 2, URL权限控制:哪些页面访问需要进行角色权限验证,怎样验证最简单有效,如何处理验证失败情况;
ralasafe团队博客在javaeye/baidu/sina等空间,同步发布。ralasafe官方网站:http://www.ralasafe.org/zh
分享到:
相关推荐
3.应用最佳实践:在开发安全模块优化管理系统时,需要应用最佳安全实践和标准。例如,您可以遵循OWASP(开放式网络应用安全项目)的建议来确保系统的安全性。 4.管理漏洞和风险:系统开发完成后,需要进行漏洞管理和...
函数计算最佳实践:快速开发一个分布式 Puppeteer 网页截图服务 函数计算最佳实践:如何轻松构建弹性高可用的音视频处理系统? 基于 DLedger 构建高可用的 Apache RocketMQ 集群 基于 RocketMQ + Knative 驱动云原生...
【网络安全精品】7-云环境下的身份管理及访问控制1.5(1).rar 是一个针对此问题的专业解决方案文档,它提供了一系列的策略、技术和最佳实践,旨在帮助企业保护其云资源并确保数据安全。该资料详尽地探讨了多租户架构...
基于Spring Boot的医药管理系统是一个针对药店或...总之,该医药管理系统通过整合现代Java开发的最佳实践,提供了一个健壮、可扩展且易于维护的解决方案,适用于毕业设计项目,能够展示学生在软件开发方面的综合能力。
“基于springboot的医院后台管理系统的设计与实现”是一个为医院管理提供全面解决方案的软件包。...它的设计理念和实现细节都体现了当前软件开发的最佳实践,适合需要构建或升级医院信息系统的机构使用。
总之,这个基于Spring Boot的智能家居系统是一个利用现代Java技术和开发最佳实践构建的系统,它提供了一套完整的解决方案,以满足现代家庭对于智能化、自动化和高效能源管理的需求。通过这个系统,用户可以方便地...
春天的云是 Spring Cloud YES是一个重建在Spring Cloud基础上的,用于快速开发的脚手架。 技术选型 ...详见: ,包含项目规范,最佳实践 组件建造及管理指南 详见: 建造,包含Keycloak,Jenkins,SonarQub
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程...我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。
内容介绍最佳实践使命和原则组织和会议即将到来的下个月...注释IT治理计划的目标是建立责任、权力和沟通链,授权人们支持全面的企业目标和策略。您通过平衡IT投资中的风险和回报、设立有效的过程和实践、为部门确定...
授权终端用户借助!View!可以使用其熟悉的个性化环境,并且可以随时随地 按需通过任何数量的设备访问该环境。管理员使用!View!可以从数据中心(而非用户!PC)对其 桌面系统、应用和相关数据进行集中控制,同时保证...
该系统的设计与开发融合了现代Web开发的最佳实践,包括使用MVC(模型-视图-控制器)架构模式,以确保代码的模块化和可维护性,并采用MySQL数据库来存储和管理用户数据和考试成绩。考试管理模块允许管理员创建和管理...
该系统集成了现代Web开发的最佳实践和技术,旨在提供一个高效、可靠且易于使用的教学档案管理平台。系统特点:模块化设计:系统采用模块化设计,使得功能扩展和维护变得更加容易和灵活。用户友好的界面:提供直观的...
该系统采用SSM(Spring + SpringMVC + MyBatis)框架进行开发,结合了当前物流管理领域的最佳实践,旨在为企业提供一套功能丰富、操作便捷的物流管理工具。 该系统涵盖了物流管理的核心功能,包括订单管理、库存...
课程设计有利于学生通过实践使经历一个数据库系统开发的全过程并受到一次综合的训练,以下是小编为大家精心推荐的数据库课程设计图书管理系统报告,欢迎阅读收藏,希望对您有所帮助。 数据库课程设计图书管理系统...
该项目的用户权限管理功能是该项目的一个亮点,可以帮助用户更好地管理和控制用户对数据的访问权限。此外,该项目还提供了数据备份和恢复、数据导入和导出等功能,可以帮助用户更好地管理和使用数据。这些功能的实现...
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程...我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。
项目简介 此商城项目,使用spring cloud全家桶进行开发 ...Spring安全:权限管理 spring cloud zuul:网关服务,用于聚合和管理长期微服务接口 spring cloud config:集中配置管理,整合各个微服务下的不同
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程...我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程...我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。
项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程...我们将遵循最佳的软件开发实践,进行系统测试和性能测试,以确保应用程序的质量和稳定性。