Web 安全开发及架构设计

Web安全开发及架构设计:SpringSecurity

本文为我的《软件安全》课程课上分享内容。


需求背景

应用场景

  • 企业工厂设备管理
  • 固定资产管理

主要功能

  • 设备管理:添加、修改、删除设备。
  • 维修管理:提交维修、完成指定设备的维修。
  • 保养管理:添加指定设备的日常保养记录。
  • 文档管理:添加、修改、删除、下载指定设备的文档。
  • 用户管理:添加、修改、删除;强制退出、修改权限。

角色划分

管理员、技术员、工人

Untitled

Untitled

Untitled

项目架构

Untitled

安全设计

应用安全

安全设计架构图

Untitled

身份鉴别和访问控制

基于Spring Security实现,有关Security框架本身的内已介绍过,下面介绍我们的使用。

流程图

Untitled

实现方式

Untitled

演示

  • 登录流程

  • 身份失效(30分钟无操作或被管理员踢下线)

  • 关闭窗口登陆失效(session storage)

    Untitled

优势

  • 综合了Session的统一管理性、和JWT Token的分布式优势。既实现了会话的可控管理,又便于在多台业务服务器上实现会话漫游。
  • 改进JWT Token的用法,使用主流的“小效期+大效期“的方案,实现30分钟无操作自动失效。
  • 同时记录当前用户的Token和IP,防止他人盗取Token使用。

日志记录

记录效果

记录请求的时间、IP、方法、操作、参数、用户。

Untitled

切面、自定义注解

使用起来非常方便!

Untitled

针对经过反向代理后可能无法获取到真实IP的情况,我们考虑了多种获取IP的方式。包括x-forwarded-forProxy-Client-IPWL-Proxy-Client-IP

目前可有效记录经过多级Nginx反代情况下获取客户IP。

业务服务器与文件服务器分离

Untitled

登陆验证码

调用方法

  1. 调用getCaptchaImage获取验证码图片(base64)和uuid
  2. 带验证码、uuid请求登陆接口

实现原理

  • 5分钟内有效:redis记录uuid和对应的验证码,并且设置TTL为300秒。

Untitled

  • 验证码使用一次后过期: 调用login接口时,查询redis中的记录。无论正确与否,只要查询过uuid对应的key,就将该key删除。

数据安全

MySQL权限控制

  • 关闭所有表DROP权限
  • 日志表禁止DELET

防止SQL注入

使用Hibernate(一款ORM框架)来实现DAO层,其可将model对象映射为数据库记录,提供增改删查的常见方法,且默认使用参数预编译,可有效防止SQL注入。

部署/配置安全

  • 文件防刷
  • 前端完善
  • 当前在线用户功能
作者

Catop

发布于

2023-05-09

更新于

2024-11-10

许可协议

评论