文章目录
一、参数认证
1.什么是参数认证
概念: 参数验证是在程序中对输入参数进行检查和验证,以确保它们满足预期的格式、范围、条件或其他特定要求。这是一种提高程序健壮性和安全性的重要实践。
在程序开发中,特别是在构建Web应用或API时,用户或其他系统可能提供数据作为输入参数。这些输入参数可能包括表单数据、URL参数、请求体中的JSON数据等。参数验证的目的是防止不正确、不安全或不符合预期的数据进入程序,从而减少潜在的错误和安全风险。
一些常见的参数验证方面包括:
- 数据类型验证: 确保参数是正确的数据类型,例如整数、字符串、日期等。
- 存在性检查: 确保必需的参数已经提供,并且不为空。
- 范围和条件检查: 验证参数是否在合理的范围内,或者是否满足特定的条件。
- 格式验证: 对于字符串类型的参数,确保其符合特定的格式,例如电子邮件地址、URL等。
- 枚举验证: 对于有限集合的参数,确保其值在预定义的选项中。
在Web开发中,参数验证通常涉及到用户提交的数据。如果用户可以通过表单、URL参数或其他方式向应用程序提交数据,那么在接受和处理这些数据之前,需要进行充分的验证以防止潜在的安全漏洞,比如SQL注入、跨站脚本(XSS)等攻击。
在很多现代的Web框架中,像Spring、Django、Express等,都提供了内建的参数验证机制,使得开发者能够相对容易地添加验证规则,从而提高程序的稳定性和安全性。
2.RuoYi中的例子
进入若依后台管理系统,选择部门管理,选择修改部门。
修改部门名称
修改为空后,立刻提示**“不能为空”**
点击“确认”按钮,弹窗提示“部门名称部门名称长度不能超过30个字符”,同时开发者工具输出响应报错信息。
看后端报错log提示
11:20:42.360 [http-nio-8080-exec-65] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [logException,208] - Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.ruoyi.common.core.domain.AjaxResult com.ruoyi.web.controller.system.SysDeptController.edit(com.ruoyi.common.core.domain.entity.SysDept): [Field error in object 'sysDept' on field 'deptName': rejected value [asdqweqwssssssssdasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssss]; codes [Size.sysDept.deptName,Size.deptName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysDept.deptName,deptName]; arguments []; default message [deptName],30,0]; default message [部门名称长度不能超过30个字符]] ]
11:28:27.505 [http-nio-8080-exec-66] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleMethodArgumentNotValidException,101] - Validation failed for argument [0] in public com.ruoyi.common.core.domain.AjaxResult com.ruoyi.web.controller.system.SysDeptController.edit(com.ruoyi.common.core.domain.entity.SysDept): [Field error in object 'sysDept' on field 'deptName': rejected value [asdqweqwssssssssdasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssss]; codes [Size.sysDept.deptName,Size.deptName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysDept.deptName,deptName]; arguments []; default message [deptName],30,0]; default message [部门名称长度不能超过30个字符]]
org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.ruoyi.common.core.domain.AjaxResult com.ruoyi.web.controller.system.SysDeptController.edit(com.ruoyi.common.core.domain.entity.SysDept): [Field error in object 'sysDept' on field 'deptName': rejected value [asdqweqwssssssssdasssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssss]; codes [Size.sysDept.deptName,Size.deptName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysDept.deptName,deptName]; arguments []; default message [deptName],30,0]; default message [部门名称长度不能超过30个字符]]
log包括了 日志时间,接口地址,警告等级,相关报错信息等,这些都在ruoyi-admin的logback.xml 文件中有所规定,能够更好地让开发者理解找到错误源和出错原因。
此处就描述了GlobalExceptionHandler拦截器和SysRole对非法数据的异常捕获。
二、自己在若依中创建例子,并且实现参数认证
1.首先利用代码生成,生成表和页面
之前做过直接用之前的就好咯
2.通过观察源码,在代码生成页面添加相关注解
观察源码
找到相关文件,找到对象和属性以及注解
根据英文猜测,两个注解分别实现“数据不为空”、“长度限制”等认证方式。
直接复制、添加到自定义学生类中
3.测试代码是否实现了参数认证
经过测试,当角色名称长度超过30时系统提示出错。
名称为空时也会报错
前端部分并没有像若依源码,暨当数据为空时就在表单内部提示。这涉及到前端的代码,在此不赘述。