安全网络身份认证系统的设计与实现

news2025/7/10 16:20:53

本文章源码地址: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欧科云链半年报解读Final

欧科云链半年报解读:净利润同比扭亏为盈,区块链大数据等创新业务贡献新增长曲线 日前,欧科云链控股(01499.HK)发布2022年度截至9月30日止的六个月中期报告。报告显示,公司在2022年4月1日至2022年9月30日实现…

【idea插件】EasyCode介绍与使用

1.简介 EasyCode是idea的一个插件,主要功能是代码生成,类似的插件还有jpa support EasyCode是idea的一个插件,可以采用图形化的方式对数据的表生成entity,controller,service,dao,mapper……无 需任何编码,简单而强大。可以大幅度的提高开发效率.下面来…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.7 DiameterSymbol

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points UG/NX二次…

第三章:远程登陆Linux系统-[实操篇]

一:为什么需要远程登陆Linux 1.1示意图 1.2说明 说明: 公司开发时候, 具体的情况是这样的 1) linux 服务器是开发小组共享的. 2) 正式上线的项目是运行在公网的. 3) 因此程序员需要远程登录到 centos 进行项目管理或者开发. 4) 画出简单的网络拓扑…

Vue3——路由的query参数和命名路由以及默认插槽slot的使用

这里主要在message页面组件和detail页面组件介绍 看一个案例,当一个二级路由下面又有许多个不同的跳转页面的时候,比如下图的about/message/detail , 需要分别展示多条信息,这里不能给每一条信息都配置一个组件,那样当信息的数量…

RocketMQ-RocketMQ 系统架构以及消息的概念

文章目录一、RocketMQ的消息模型1、RocketMQ的基础消息模型,一个简单的Pub/Sub模型2、RocketMQ 扩展后的消息模型3、RocketMQ的部署模型二、RocketMQ的系统架构2、Consumer3、Name Server3.1、路由注册3.2、路由剔除3.3、路由发现3.4、Client 对 NameServer选择策略…

Spring5框架总结学习(从入门到进阶)-AOP

文章目录AOP1、基本概念2、底层原理3、底层原理实现4、AOP(术语)5、准备工作6、基于注解实现AOP 1、基本概念 面向切面编程可用对各个业务逻辑各个部分进行隔离 2、底层原理 AOP底层使用动态代理 有2种情况动态代理 有接口 使用JDK动态代理无接口 使…

ffmpeg编译安装

ffmpeg编译安装前言一、下载ffmpeg二、编译安装2.1 Linux编译ffmpeg2.2 Windows编译ffmpeg总结前言 Fmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含…

154. SAP UI5 Smart Table 和 Smart Filter Bar 的联合使用方法介绍

本教程第 147 个步骤,我们介绍了 SAP UI5 Smart Table 控件的用法: SAP UI5 应用开发教程之一百四十七 - SAP UI5 SmartTable 控件的使用介绍如下图所示: 本步骤我们在 Smart Table 本身的基础上再进一步,学习如何将 Smart Table 配合 Smart Filter Bar 共同使用。 先看一…

JDK之强软弱虚引用

Java中强软弱虚引用的整体架构: 强引用 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象…

Fabric.js 元素被遮挡的部分也可以操作

本文简介 点赞 关注 收藏 学会了 题目: 当两个元素有部分重叠时,选中底层元素后,想通过被盖住的部分移动元素,该如何实现? 其实 Fabric.js 已经提供了相应的 API 去完成上面的需求了。但直到今天, Fabr…

动态内存开辟+柔性数组

C/C中程序内存区域划分 (数据段就是静态区) C/C程序内存分配的几个区域: 1.栈区 (stack): 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集…

linux系统中裸机实现RTC的基本方法

大家好,今天主要和大家聊一聊,如何显示RTC实时时钟的方法。 目录 第一:RTC实时时钟简介 第二:利用SNVS_LP的SRTC的具体配置方法 第三:初始化RTC对应的代码 第一:RTC实时时钟简介 在高端芯片中&#xff0…

Docker管理面板Crane开源了!

导读数人云容器管理面板 Crane 开源啦!Crane 包含着数人云工程师对 Docker 最新技术的热爱和实践。希望借助开源社区的力量,让 Crane 完善自身,更好地成长起来,让更多的国内用户体验并参与到最新的容器技术中。在 Docker 内置 Swa…

Java HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 HashMap 是无序的&#x…

2023年天津理工大学中环信息学院专业课考试具体安排

天津理工大学中环信息学院2023年高职升本科专业课考试时间地点及防疫须知 一、考试时间地点 考试时间:2022年12月29日上午。 具体考试时间以准考证上显示的为准。 考生可提前半小时入场,考试开始(铃声)后,禁止入场&…

【python绘制地图——folium实用功能进阶】

Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍(思维导图) 第二章 使用folium制作地图 第三章 folium实用功能进阶 第三章 使用Html2Image生成png图片 第四章 使用reportlab制作pdf报告 文章目录Python使用folium制作地图并生成…

基于C++实现对UNet图像分割的部署

本博文利用UNet介绍图像分割的部署,重点介绍采用warpaffine对图像进行预处理,以及后处理decode部分的代码。 1. Unet网络介绍 UNet它是一个encoder - decoder的结构,那么encoder对应就是这个u型网络左边这半部分,也就是我们特征提取及下采样这部分。decoder解码就是右边部…

华为机试_HJ41 称砝码【中等】【menset】【多重背包】【动态规划】【收藏】

目录 描述 输入描述: 输出描述: 解题过程 提交代码 学习代码 代码一 动态规划 代码二 代码三 收藏点 1. menset函数 2. 动态规划-多重背包问题 描述 现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种…

【程序人生】我填写《2022年国内软件质量调查问卷》的感想

1、前言 说一下为啥会参加这个问卷,其实初衷是本着自身感受,和希望能学习到更好的软件质量方案去填写的。所以,最后也是建议本次问卷的内容,能够提供更多切实可行的提高软件质量的实践方案。 2、参与问卷后的所思所想 2.1 经历过…