# wlj-security **Repository Path**: wanmingtang/wlj-security ## Basic Information - **Project Name**: wlj-security - **Description**: 基于spring-security二次开发的可以应用基于浏览器或前后端分离,手机app等前后端模式的场景的安全认证、授权框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-03-08 - **Last Updated**: 2021-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 介绍 目前所在公司项目虽然使用了spring-cloud框架开发微服务项目,但是在很多地方其实都不符合微服务的定义,我所知的微服务定义: 1. 单一职责 2. 轻量级通讯,如 http通讯协议 3. 隔离性 4. 每个有自己的数据,独立存储系统 5. 技术多样性,有独立技术栈,如:c,java,golang,python 比如我们的登陆授权模块也就是"安全中心"是和用户服务耦合在一块的,另外我们的cms后台虽然有设计"安全"策略但是还有很多不规范、不足的方法, 为了改善这样的情况我选择了spring-security(来自Spring全家桶系列,与SpringBoot无缝衔,各大中小公司广泛使用的)安全框架来进行二次开发一个 简易配置使用的"安全套件" 主要分为三个模块: - wlj-security-core : 安全核心包 - wlj-security-browser : pc浏览器开发依赖包 - wlj-security-app : app、小程序等开发依赖包 - - - ## spring-security基本原理介绍 在介绍安全模块的使用之前先简单介绍一下spring-security基本原理帮助理解 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200309134002523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTM1NDMz,size_16,color_FFFFFF,t_70) 上图中,最右边这个就是我们的Rest API,也就是我们平时写的Controller,左边的这组过滤器链正是Spring Security的核心。实际上Spring Security的本质就是一组Filter。 - - - ## wlj-security-core核心包介绍 core主要包含了app、browser模块共有的组件:手机短信验证码认证filter,统一的验证码校验filter(短信验证码、图形验证码)。另外还有各个组件的properties配置类 以及browser端的第三方社交登录组件等。 支持功能: - 手机验证码认证 method: POST application/x-www-form-urlencoded url: /authentication/mobile (接口地址由常量指定暂不支持配置) params: mobile smsCode - 校验指定url携带的图形、短信验证码 目前默认校验以下两个uri的验证码: 自定义用户名密码认证:/authentication/form 校验参数名 imageCode 手机短信验证码认证:/authentication/mobile 校验参数名 smsCode 若想增加需校验的uri,可以参考如下配置: ```yaml wlj: security: code: image: url: /test,/testA sms: url: /xxx,/yyy ``` - browser端社交登录 实现第三方社交登录我使用了spring-social依赖version:1.1.4-RELEASE(tip:spring官网上已标注spring-social在2019-7已停止支持) 一般第三方认证厂家(QQ、微信等)都是遵循的OAuth2.0协议来实现授权第三方应用,获取用户数据的功能 贴一个OAuth2.0参考地址: [http://www.ruanyifeng.com/blog/2019/04/oauth_design.html](http://www.ruanyifeng.com/blog/2019/04/oauth_design.html). **OAuth2.0协议一般的授权模式**: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200310113348559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTM1NDMz,size_16,color_FFFFFF,t_70) 其中"授权码模式"是最安全也最常用的: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200310113535241.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTM1NDMz,size_16,color_FFFFFF,t_70) 同样的,spring-social也会在security过滤器链中注册一个filer:SocialAuthenticationFilter ,当请求匹配uri前缀: /auth/{providerId} 时将触发相应第三方认证流程获取access_token,openid及第三方用户信息。 /auth: 前缀为SocialAuthenticationFilter默认指定的,也可通过以下配置修改: ```yaml wlj: security: social: filterProcessesUrl: /demoAuth ``` 后面的{providerId}为相应的第三方标识符,目前仅支持 qq、weixin - - - ## wlj-security-browser安全模块使用 __wlj-security-browser是在基于pc浏览器的网站应用的场景下使用的安全依赖包__ 只需在pom文件中引入该依赖: ```xml com.wlj.security wlj-security-browser ${com.wlj.security.version} ``` 支持功能: - core所有功能 - 退出登录 - "记住我" - 同一账户不同设备登入session限制 相关使用配置: ```yaml wlj: security: browser: signOutUrl: /demo-logout.html #配置自定义退出登录成功页,否则返回:退出成功json loginType: JSON #配置登录成功or失败时的处理方式,JSON(默认):返回成功或失败信息 REDIRECT:重定向,成功则跳转到触发认证的url,失败则跳转到默认错误展示页 signUpUrl: /demo-signUp.html #配置自定义注册|绑定(绑定已有用户)页,社交登录时用户不存在跳转此页面。若用户实现了ConnectionSignUp接口,则根据社交信息自动注册一个账号,就无需此页面了 loginPage: /login.html #配置自定义登录页,否则使用默认登录页 rememberMeSeconds: 3700 #配置"记住我"功能的"记住时间",缺省:3600s session: sessionInvalidUrl: /session-invalid #配置session失效(可能会话过期或被踢下线)默认的跳转地址(可以是页面地址或是返回json的接口地址),否则跳转到默认页 maximumSessions: 1 #配置同一用户在系统中的最多session数,默认1 maxSessionsPreventsLogin: false #达到最大session数时是否阻止新的登录请求,默认false,不阻止,否则新的登录会让老的登录session失效 social: filterProcessesUrl: /demoAuth #配置触发第三方登录的请求uri前缀,/demoAuth/${providerId} weixin: app-id: xxxxx app-secret: yyyy qq: providerId: qq app-id: xxxxxxxxxxxx app-secret: yyyyyyyyyyy code: image: length: 4 #配置验证码中数字个数,默认4 width: 67 #配置图形验证码的宽度,缺省:67 另外还支持请求级配置: /code/image?width=10&height=20 height: 23 #配置图形验证码的高度,缺省:23 expireIn: 60 #配置验证码有效期,缺省:60s url: /test #这里的url以及下面的url定义的是除了/authentication/form,/authentication/mobile以外还需要校验验证码的url,多个以逗号分隔 sms: length: 4 expireIn: 60 url: xxx,yyy ``` - - - ## wlj-security-app安全模块使用 **wlj-security-app是在基于移动app或前后端分离应用的场景下使用的安全依赖包,封装了认证服务器端的行为(发令牌、验令牌)** 只需在pom文件中引入该依赖: ```xml com.wlj.security wlj-security-app ${com.wlj.security.version} ``` 支持功能: - core所有功能 - openid认证登录 一般app接入的第三方SDK提供的社交登录功能是简化模式的,QQ、微信都是如此 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200311102128993.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTM1NDMz,size_16,color_FFFFFF,t_70) 同样也是在spring-security过滤器链上加上一个OpenIdAuthenticationFilter 匹配POST application/x-www-form-urlencoded uri /authentication/openid 请求 参数:openId : 已注册的第三方openid providerId:第三方服务商id,目前支持qq,weixin