本文章源码地址:https://gitee.com/sukels/shiroicon-default.png?t=M85Bhttps://gitee.com/sukels/shiro

摘  要

随着互联网的飞速发展,Web应用的安全问题日益凸显。为了保护Web应用中用户和企业的敏感信息,认证授权加密已经成为了Web应用中不可缺少的部分。但是随之而来是巨大的代码工作量和复杂的代码逻辑,软件开发者们渴求着能帮助他们轻松高效解决安全需求的java框架。文章首先研究了如今主流的java安全框架Shiro,了解到Shiro是一个简单易用且功能强大的安全框架,可以与很多第三方框架良好地耦合,并且可以在任何应用环境中使用。接着通过介绍Shiro的四个基本功能:认证、授权、会话管理、加密的相关知识,以及其通配符权限系统,为后面利用Shiro完成安全模块的设计与实现奠定了基础。随后,针对实际登录案例,结合其业务分析了其Web应用的安全性需求:登录认证需求,浏览器请求拦截需求,用户权限管理需求。针对登录案例的这些安全性需求,先是利用Shiro的过滤器实现了浏览器请求的拦截,使得强制安全规则变得灵活可配置。接着利用Shiro的认证功能设计实现了能及时反馈用户账号异常的登录认证系统。最后结合Shiro的通配符权限,设计实现了多层次细粒化的权限控制系统,并针对权限配置工作量大的问题提出了权限预置的解决方案。最后,通过对登录案例安全模块的测试,结果证明Shiro的确帮助完成了登录案例安全模块的设计与实现。并且在软件开发过程中,Shiro框架的植入并未对原有的代码造成较大影响。而Shiro封装的认证、授权流程以及JSTL标签,也使得开发人员的代码工作量大大减少。综上所述,Shiro作为一个安全框架,真正帮助软件开发者轻松高效地解决了安全需求。

关键词: Web;安全框架;Shiro;认证;授权;

Abstract

With the rapid development of the Internet, the security of Web applications is becoming increasingly prominent. In order to protect the sensitive information of users and enterprises in Web applications, authentication, authorization and encryption have become an indispensable part of Web applications. But with a huge amount of code work and complex code logic, software developers are hungry for java frameworks that can help them solve their security needs easily and efficiently. This article first studied Shiro, the current mainstream java security framework, and learned that Shiro is a simple and powerful security framework that can be well coupled with many third-party frameworks and can be used in any application environment. Then, by introducing Shiro's four basic functions: authentication, authorization, session management, encryption, and its wildcard permission system, it lays a foundation for the design and implementation of Shiro's security module. Then, according to the actual login case, combined with the business analysis of the Web application security requirements: login authentication requirements, browser request interception requirements, user rights management requirements. To address these security requirements for login cases, Shiro's filters are first used to intercept browser requests, making mandatory security rules flexible and configurable. Then the authentication function of Shiro is used to design and implement the login authentication system which can timely feedback user account anomalies. Finally, combined with Shiro's wildcard permission, a multi-level fine-grained permission control system is designed and realized, and a permission presetting solution is proposed to solve the problem of the heavy workload of permission configuration. Finally, through the test of the login case security module, the result proves that Shiro really helps to complete the design and implementation of the login case security module. And in the process of software development, the Shiro framework implantation did not have a significant impact on the original code. Shiro's encapsulated authentication and authorization processes, as well as JSTL tags, also greatly reduce the developer's code workload. To sum up,Shiro is a security framework that really helps software developers to easily and efficiently address their security needs.

Key words: Web; Security framework; Shiro; Certification; Authorization;

1 引言

1.1 什么是权限控制

基本上,所有涉及用户参与的系统都必须遵守权限管理。权限管理属于安全系统。权限管理实现对用户访问系统的控制。用户可以访问授权资源仅根据安全规则或安全政策。

权限管理包括两部分:用户身份验证和授权,称为身份验证和授权。对于需要控制访问权限的资源用户,您可以首先验证,然后使用访问权限访问该资源。

权限管理在系统中一般分为:

访问权限:一般表示你能做什么样的操作,或者能够访问那些资源。例如:给张三赋予“店铺主管”角色,“店铺主管”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。此时张三能够进入系统,则可以进行这些操作

数据权限:一般表示某些数据你是否属于你,或者属于你可以操作范围。例如:张三是"店铺主管"角色,他可以看他手下客服人员所有的服务的买家订单信息,他的手下只能看自己负责的订单信息

1.2 什么是身份验证

身份验证是确定用户是否是合法用户的过程。最常见的方法是通过检查用户输入的用户名和密码来验证用户身份,以查看用户是否正确。查看它是否与存储在系统中的用户名和密码一致。有关指纹和其他系统,请查看指纹;主要设备,如信用卡系统,需要信用卡。

1.3 什么是授权

授权,即访问控制,控制可以访问某些资源的人员。验证后,主体需要设置对系统资源的访问权限。未经许可,某些资源无法访问。

2 Shiro安全框架研究

2.1 Shiro概述与介绍

Shiro是Apache的开源框架。它从安全认证软件系统中提取相关任务。用户意识到身份验证、权限、加密、会话管理等构成了一个公共安全身份验证框架。

2.2 Shiro的优点

Shiro 是一个强大而灵活的开源安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。如下是它所具有的特点:

· 易于理解的 Java Security API;

· 简单的身份认证(登录),支持多种数据源(LDAP,JDBC 等);

· 对角色的简单的签权(访问控制),也支持细粒度的鉴权;

· 支持一级缓存,以提升应用程序的性能;

· 内置的基于 POJO 企业会话管理,适用于 Web 以及非 Web 的环境;

· 异构客户端会话访问;

· 非常简单的加密 API;

· 不跟任何的框架或者容器捆绑,可以独立运行。

2.3 Shiro的认证

2.3.1什么是认证

​身份验证是确定用户是否为合法用户的过程。最常见的方法是通过检查用户输入的用户名和密码来验证用户身份,以查看其姓名是否匹配。存储在系统中的用户和密码。例如:登录密码、短信验证、第三方许可等。

2.3.2认证流程

2.3.3关键对象

上边的流程图中需要理解以下关键对象:

Subject:主体:访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

Principal:身份信息是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。

credential:凭证信息:是只有主体自己知道的安全信息,如密码、证书等。

2.4 Shiro的授权

2.4.1什么是授权

授权,即访问控制,它控制可以访问的资源。代理身份验证后,系统执行并分配适当的权限。访问资源时,它会验证您是否有访问这些资源的权限。

这里首先理解4个对象:

  • 用户对象user:当前操作的用户、程序。
  • 资源对象resource:当前被访问的对象
  • 角色对象role:一组 "权限操作许可权" 的集合。
  • 权限对象permission:权限操作许可权

2.4.2授权流程

2.4.3关键对象

授权可简单理解为who对what进行How操作

Who:主体(Subject),可以是一个用户、也可以是一个程序

What:资源(Resource),如系统菜单、页面、按钮、方法、系统商品信息等。

访问类型:商品菜单,订单菜单、分销商菜单

数据类型:我的商品,我的订单,我的评价

How:权限/许可(Permission)

我的商品(资源)===>访问我的商品(权限许可)

分销商菜单(资源)===》访问分销商列表(权限许可)

3 登录案例设计与实现

3.1 技术环境搭建

本实例环境:IntelliJ IDEA + Maven

本实例采用的主要技术:SpringBoot+Mybatis+Shiro+Bootstrap+Thymeleaf

3.2 数据库设计与实现

3.2.1数据库表设计

1.设计role表存储角色信息

类型

长度

小数点

不是null

虚拟

注释

id

int

主键

name

varchar

225

remark

varchar

225

表3-1 role表设计

 2.设计user表存储用户信息

类型

长度

小数点

不是null

虚拟

注释

id

int

主键

username

varchar

225

password

varchar

225

role_id

int

辅键

表3-2 user表设计

3.2.2数据库图解

user:用户表,一个用户可以有多个角色

role:角色表,一个角色可以有多个资源

关联:SELECT * FROM role INNER JOIN `user` ON role.id = `user`.role_id

3.2.3数据库脚本

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role`  (

  `id` int(2) NOT NULL AUTO_INCREMENT,

  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,

  PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

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

-- Records of role

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

INSERT INTO `role` VALUES (1, 'root', '超级管理员');

INSERT INTO `role` VALUES (2, 'admin', '管理员');

INSERT INTO `role` VALUES (3, 'user', '普通用户');

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

-- Table structure for user

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

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user`  (

  `id` int(10) NOT NULL AUTO_INCREMENT,

  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `role_id` int(3) NOT NULL,

  PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

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

-- Records of user

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

INSERT INTO `user` VALUES (1, 'rootA', '123456', 1);

INSERT INTO `user` VALUES (2, 'adminA', '123456', 2);

INSERT INTO `user` VALUES (3, 'userA', '123456', 3);

INSERT INTO `user` VALUES (4, 'userB', '123456', 3);

SET FOREIGN_KEY_CHECKS = 1;

3.3 ShiroConfig配置

3.3.1图解

3.3.2原理分析

  • 创建SimpleCookie,访问项目时,会在客户端中cookie中存放ShiroSession的对。
  • 创建DefaultWebSessionManager会话管理器定义cookie机制、定时刷新、全局会话超时时间然后交于DefaultWebSecurityManager权限管理器管理。
  • 创建自定义ShiroDbRealm实现,用于权限认证、授权、加密方式的管理,同时从数据库中取得相关的角色、资源、用户的信息,然后交于DefaultWebSecurityManager权限管理器管理。
  • 创建DefaultWebSecurityManager权限管理器用于管理DefaultWebSessionManager会话管理器、ShiroDbRealm。
  • 创建lifecycleBeanPostProcessor和DefaultAdvisorAutoProxyCreator相互配合事项注解的权限鉴权。
  • 创建ShiroFilterFactoryBean的shiro过滤器指定权限管理器、同时启动连接链及登录URL、未登录的URL的跳转。

3.3.3 ShiroConfig代码

(1)设置安全管理器

(2)设置Shiro内置过滤器配置

3.4 ShiroRealm定义

3.4.1图解

3.4.2原理分析

  1. ShiroDbRealmImpl继承ShiroDbRealm向上继承AuthorizingRealm,ShiroDbRealmImpl实例化时会创建密码匹配器HashedCredentialsMatcher实例,HashedCredentialsMatcher指定hash次数与方式,交于AuthenticatingRealm。
  2. 调用login方法后,最终调用doGetAuthenticationInfo(AuthenticationToken authcToken)方法,拿到SimpleToken的对象,调用UserBridgeService的查找用户方法,把ShiroUser对象、密码和salt交于SimpleAuthenticationInfo去认证。
  3. 访问需要鉴权时,调用doGetAuthorizationInfo(PrincipalCollection principals)方法,然后调用UserBridgeService的授权验证 。

3.4.3用户授权设计与实现

3.4.4用户认证设计与实现

4 登录案例测试

4.1 性能测试

性能测试是非功能软件性能的一种体现。它不关注该方案何时可以执行具体任务,而是在任务完成后进行更正。在各种常规条件下,通过自动测试工具来模拟一组软件,用于测试系统性能。这份测试报告主要通过以下方式完成:压力测试、负载测试、稳定性测试、连接速度测试等。

4.4.1 测试方法

将该系统放到 IDEA 2021.2 上进行运行,执行相关操作进行程序的测试。

4.4.2 测试环境

测试环境如表4-1 所示。

软件环境(相关软件、操作系统等)

操作平台:Windows 11 64 位

数据库:MySql 5.7.36

浏览器:Google Chrome

硬件环境(网络、设备等)

CPU:2.28 GHz

内存:16 GB

4-1 测试的系统环境

4.4.3测试结果

经过多次反复的测试,系统运行正常,请求与回馈响应时间迅速,基本符合系统的性能特征,其主要的性能测试如下 4-2 表所示。

测试点

测试说明

注解

压力测试

多次反复的进行操作,测试系统资源是否占用异常

该系统某项功能反复进行操作

负载测试

该系统在各种边界压力情况下,检查系统是否可以正常响应

如内存满时浏览,电脑没电时安装,运行时出现网络异常等

响应能力测试

测试系统的各项操作是否满足用户响应时间需求

例如系统的浏览、功能的响应时间等

基础测试

用户的应用场景下,系统资源的使用情况

对比测试

与同款产品的对比测试

4-2 主要的性能测试

4.2 数据库模块测试

(1)测试代码

(2)测试结果

4.3用户界面测试

用户页面测试也称为UI(User Interface)测试。用户界面测试的目的是确保用户页面通过测试对象功能为用户提供访问或浏览功能的权限,它可以通过浏览对象测试来正确反映业务功能和需求。此浏览包括在窗口和字段之间浏览,对象和各种访问方法的功能。

测试页面图为登录页面,用户界面测试规范,如表 4-3

测试目标

 确保用户界面通过适当的操作为用户提供访问和浏览,以测试对象的功能。此外,用户界面测试还应确保用户界面中的对象具有满足预期需求的功能,并符合软件行业标准。用户界面应该友好并满足用户需求。

测试范围

涵盖操作界面中所有的反应广大用户需求和习惯的能够得到改进的部分

技术

触发系统所有超链接和按钮事件,查看页面的跳转目标网页,页面的响应时间;对那些需要频繁显示的网页进行反复测试,测试其异常处理能力和界面的美观程度。极少使用的网页保证不出错误。

以核实以下内容:

大部分网页界面是很符合用户要求的,页面的响应能力符合用户需求。

在用户登录页面中有用户反映界面不美观,需要改进。

开始标准

系统正常运行

完成标准

用户对页面操作时,满足用户需求,如点击连接或按钮时,页面响应时间快。界面的设计符合绝大多数用户的审美需求,具有友好的用户界面。

测试重点和优先级

系统页面设计优先

4-3 用户界面测试规范

4.3.1登录界面

4.3.2首页界面

4.3.3认证授权跳转页面

(1)首页页面必须登录成功之后才能访问

(2)所有用户、游客等都可访问登录页面、测试页面,无需登录

(3)拥有 root 角色的用户可以访问所有页面,包括添加页面、删除页面、查询页面、测试页面等 

(4)拥有admin 角色的用户可以访问添加页面,查询页面、测试页面,除了删除页面不能访问

(5)拥有 user 角色的用户可以访问 查询页面、测试页面,除了添加页面、删除页面不能访问

4.4 异常设计方法测试

异常分析法就是针对系统有可能存在的异常操作、软硬件缺陷引起的故障进行分析,依此设计测试用例。主要针对系统的容错能力、故障恢复能力进行测试。简单一点说就是人为让系统出现故障,然后检查系统的故障恢复能力。这些故障包含软件和硬件方面的故障,常见的故障有:断电、断网、硬件损坏、数据损坏、内存不够。需要多查看用户反馈的故障报告,多深入了解被测的系统。

4.5 测试结果及缺陷分析 

4.5.1 覆盖分析 

需求覆盖分析如 4-4 表所示:

需求/功能

测试次数

是否测试

是否通过

备注

用户登陆注册

>40

界面跳转正常显示

>60

后台管理

>50

4-4 需求覆盖分析

测试覆盖分析如 4-5 表所示:

需求/功能

测试用例数

执行数

通过数

失败数

备注

功能点切面

36

36

35

1

组合测试失败一次

特定切面

9

9

9

0

隐含切面

9

9

9

0

4-5 测试覆盖分析

4.5.2 缺陷分析 

出现的缺陷如 4-6 表所示:

序号

描述

模块

1

操作时卡顿

系统

2

负载能力弱

4-6 出现的缺陷

参考文献

[1] 吴艳 曹平编著,《软件工程导论》清华大学出版社,2021.4

[2] 王珊 萨师煊编著,《数据库系统概论(第五版)》北京高等教育出版社,2014.9

[3] 陈昊鹏 郭嘉,译《Java 编程思想(第 4 版)》北京 机械工业出版社,2007.5

[3] 钱雪忠.数据库原理及应用.北京邮电大学出版社.2010

[4]CSDN - 专业开发者社区 

[5] 宁海元 周振兴 彭立勋 翟卫祥 刘辉译《高性能 MySQL(第 3 版)》电子工业出版社,2013.5.1

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐