五、Spring Security认证和授权-实现自定义图片验证码功能

一、图形验证码的作用

图形验证码是验证码的一种。验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意**密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力**方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。下面我们基于Spring Security实现图形验证码登录功能。
五、Spring Security认证和授权-实现自定义图片验证码功能

二、图片验证码流程分析

对于用户来说,打开登录页面时,验证码就已经展示在登录表单中,输入必要的登录信息后再填写图片验证码,点击登录,经过验证后就能进入系统。下面我们来分析一下具体的实现流程、可能遇到的问题及解决方案。

1、PC端做图形验证码,一般会采用SESSION的方法,后台将生成的验证码存储到SESSION中,并将SESSION的ID记录在浏览器的COOKIE里,用于标识一个客户端。

2、APP 通常使用 REST 架构,而 REST 是没有 cookie 的,APP用户身份的唯一识别是通过 token 进行的。
为了解决PC端和APP端不相容的问题,我们决定采用Redis存储验证码信息。
五、Spring Security认证和授权-实现自定义图片验证码功能
用户获取图片验证码。用户在获取图形验证码时由前端生成一个唯一的标识deviceId,加到验证码请求地址中发送给后端。后端收到请求后读取deviceId信息,生成验证码后,将deviceId作为key,验证码信息为value存储在 Redis中,并将验证码图片信息返回给前端。
五、Spring Security认证和授权-实现自定义图片验证码功能
用户登录。用户填写登录信息和验证码信息,点击登录按钮时,前端将之前生成的deviceId放到Request Headers中,一起发送给后端。后端接收请求,在进入Spring Security表单登录拦截器之前,被我们自定义的验证码拦截器ValidateCodeFilter先进行拦截,获取deviceId,到Redis中读取验证码信息,和用户发送的验证码进行比较,相同则通过,进行后面的基于SpringSecurity的表单登录验证。不同则抛出异常,用户登录失败。

三、图片验证码功能实现

为了便于后期扩展实现短信验证码功能,我们通过校验码处理器ValidateCodeProcessor接口定义验证码需要实现的主要正能,即创建验证码和校验验证码。
通过抽象类AbstractValidateCodeProcessor(实现ValidateCodeProcessor接口)规范验证码主要流程。抽象类定义了生成验证码的步骤为:生成、存储、发送三个方法。生成方法中使用生成器接口ValidateCodeProcessor,具体的图片验证码生成器ImageCodeGenerator实现ValidateCodeProcessor接口,不同的业务可以自定义实现验证码生成规则。存储校验码方法中,可以自定义存储器实现类,放在session中或者Redis或者其他存储介质,可以*选择。发送校验码方法是一个抽象方法,验证码处理器ImageCodeProcessor继承抽象类AbstractValidateCodeProcessor,并实现了该方法,实现将图片验证码返回给前端功能。
抽象类AbstractValidateCodeProcessor同时定义了校验方法validate(),对验证码进行一系列校验。
校验码处理器接口ValidateCodeProcessor
五、Spring Security认证和授权-实现自定义图片验证码功能
校验码处理器抽象类AbstractValidateCodeProcessor
五、Spring Security认证和授权-实现自定义图片验证码功能

生成校验码方法五、Spring Security认证和授权-实现自定义图片验证码功能

保存校验码方法五、Spring Security认证和授权-实现自定义图片验证码功能

发送校验码方法,由子类实现五、Spring Security认证和授权-实现自定义图片验证码功能

验证校验码五、Spring Security认证和授权-实现自定义图片验证码功能

验证码生成器接口
五、Spring Security认证和授权-实现自定义图片验证码功能
默认的图片验证码生成器
五、Spring Security认证和授权-实现自定义图片验证码功能
五、Spring Security认证和授权-实现自定义图片验证码功能
五、Spring Security认证和授权-实现自定义图片验证码功能
验证码存取器接口
五、Spring Security认证和授权-实现自定义图片验证码功能
Redis实现验证码存取器
五、Spring Security认证和授权-实现自定义图片验证码功能
五、Spring Security认证和授权-实现自定义图片验证码功能
五、Spring Security认证和授权-实现自定义图片验证码功能
图片验证码API入口
五、Spring Security认证和授权-实现自定义图片验证码功能
校验验证码的过滤器
五、Spring Security认证和授权-实现自定义图片验证码功能
配置校验码过滤器
五、Spring Security认证和授权-实现自定义图片验证码功能
大功告成!

四、资源管理系统演示

项目演示地址:http://175.24.75.121/#/login
用户名:visitor
密码:visitor
五、Spring Security认证和授权-实现自定义图片验证码功能
五、Spring Security认证和授权-实现自定义图片验证码功能

五、GITHUB

前端工程:https://github.com/STIll-clx/rms-admin-web
后端工程:https://github.com/STIll-clx/rms

六、专题导航

上一节:四、Spring Security认证和授权-动态授权解决方案