# 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基本原理帮助理解

上图中,最右边这个就是我们的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协议一般的授权模式**:

其中"授权码模式"是最安全也最常用的:

同样的,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、微信都是如此

同样也是在spring-security过滤器链上加上一个OpenIdAuthenticationFilter
匹配POST application/x-www-form-urlencoded uri /authentication/openid 请求
参数:openId : 已注册的第三方openid providerId:第三方服务商id,目前支持qq,weixin