Web 安全开发及架构设计
Web安全开发及架构设计:SpringSecurity
本文为我的《软件安全》课程课上分享内容。
需求背景
应用场景
- 企业工厂设备管理
- 固定资产管理
主要功能
- 设备管理:添加、修改、删除设备。
- 维修管理:提交维修、完成指定设备的维修。
- 保养管理:添加指定设备的日常保养记录。
- 文档管理:添加、修改、删除、下载指定设备的文档。
- 用户管理:添加、修改、删除;强制退出、修改权限。
角色划分
管理员、技术员、工人
项目架构
安全设计
应用安全
安全设计架构图
身份鉴别和访问控制
基于Spring Security实现,有关Security框架本身的内已介绍过,下面介绍我们的使用。
流程图
实现方式
演示
登录流程
身份失效(30分钟无操作或被管理员踢下线)
关闭窗口登陆失效(session storage)
优势
- 综合了Session的统一管理性、和JWT Token的分布式优势。既实现了会话的可控管理,又便于在多台业务服务器上实现会话漫游。
- 改进JWT Token的用法,使用主流的“小效期+大效期“的方案,实现30分钟无操作自动失效。
- 同时记录当前用户的Token和IP,防止他人盗取Token使用。
日志记录
记录效果
记录请求的时间、IP、方法、操作、参数、用户。
切面、自定义注解
使用起来非常方便!
针对经过反向代理后可能无法获取到真实IP的情况,我们考虑了多种获取IP的方式。包括x-forwarded-for
、Proxy-Client-IP
、WL-Proxy-Client-IP
目前可有效记录经过多级Nginx反代情况下获取客户IP。
业务服务器与文件服务器分离
登陆验证码
调用方法
- 调用getCaptchaImage获取验证码图片(base64)和uuid
- 带验证码、uuid请求登陆接口
实现原理
- 5分钟内有效:redis记录uuid和对应的验证码,并且设置TTL为300秒。
- 验证码使用一次后过期: 调用login接口时,查询redis中的记录。无论正确与否,只要查询过uuid对应的key,就将该key删除。
数据安全
MySQL权限控制
- 关闭所有表DROP权限
- 日志表禁止DELET
防止SQL注入
使用Hibernate(一款ORM框架)来实现DAO层,其可将model对象映射为数据库记录,提供增改删查的常见方法,且默认使用参数预编译,可有效防止SQL注入。
部署/配置安全
- 文件防刷
- 前端完善
- 当前在线用户功能
Web 安全开发及架构设计