在日常开发过程中,发现有一个重要的组件会被经常使用到,但是又没有一个比较好用的功能集合,在开发项目是需要反复配置,造成了大量不必要的重复性简单劳动,因此对日常使用到功能进行了一个通用封装,形成了【易水风萧通用组件】,方便后期项目开发。
易水风萧通用组件主要包含以下一些常用功能:
- swagger-ui文档
- 全局跨域支持
- 全局异常捕获
- 通用辅助工具
- 验证码功能
- spring security
- oauth2
- spring social (QQ登录 、微信登录)
在使用 易水风萧通用组件 之前,需要先在项目的pom依赖里加入以下配置:
1 | <dependency> |
注意:在使用时请参考 https://mvnrepository.com/artifact/com.yishuifengxiao.common/common-spring-boot-starter 将版本号替换为最新版本。
本文档针对于3.0.0及后续版本,由于3.0.0版本更新内容较多,对于历史版本本说明文档可能会有较大出入。
一 swagger-ui文档
1.1 快速启动
在配置文件中加入以下配置即可快速开启swagger-ui功能。
1 | yishuifengxiao.swagger.base-package= 需要扫描的控制器代码的路径 |
加入上述配置后,即可通过
或者
http://ip:port/swagger-ui.html
查看自己的swagger-ui文档了。
此外,也可以通过http://ip:port/v2/api-docs查看元数据
这里只是简化了swagger-ui的扫描注解,对于软件开发过程中必须swagger-ui其他API注解任然不可省略。
下面是一个简单的swagger-ui配置文档示例
1 | @Api(value = "【测试接口】测试接口", tags = {"测试接口"}) |
特别鸣谢: 此项功能中的doc.html界面中功能使用到了刀哥的 swagger-bootstrap-ui 中的功能 ,在此特别感谢 刀哥 的大力支持,关于swagger-bootstrap-ui的详细说明请参见刀哥的 swagger-bootstrap-ui文档
1.2 常规配置
1 | # swagger-ui文档的标题 |
以上常规配置都有缺省默认值,用户在使用 易水风萧通用组件 时,如果没有特别需要,使用默认配置即可。
1.3 进阶配置
一般情况下,使用swagger-ui的常规配置即可满足日常开发需要,但是在某些情况下,可能需要一些高级配置。如,需要通过在所有的API接口上批量加上一个默认参数,此时即可用通用组件的高级配置功能了。
1 | yishuifengxiao.swagger.contact.auths[0].name=Authorization |
上述示例配置在API文档中的所有请求中批量添加了一个参数名为Authorization的请求头参数。
yishuifengxiao.swagger.contact.auths是一个数组,可以添加多个配置,更多详细配置可参见参见swagger-ui的 ParameterBuilder 用法配置
二 全局跨域配置
快速启动
在 系统的配置文件增加一下配置
1 | yishuifengxiao.cors.enable=true |
注意: 默认开启了跨域支持,如需关闭将值设置为 false 即可
三 全局全局异常捕获
全局异常捕获不需要显式开启,在项目中加入了易水风萧通用组件后会自动启动。
四 通用辅助工具
通用辅助工具是基于ApplicationContextAware
的接口扩展,通过ApplicationContextAware
注入spring 上下文,让用户无需再在各个类中显式注入其他的引用依赖,能快速地通过 ApplicationContext
获取到对象的示例。
本工具里常用的方法签名有
1 | /** |
五 验证码功能
在日常开发过程中,经常需要使用到验证码功能,在易水风萧通用工具中对常见的 图形验证码、邮箱验证码、短信验证码做一个通用封装。在这三种类型的验证码中,目前仅对图形验证码和邮箱验证码做了缺省性实现,由于短信验证码中短信发送的特殊性,需要用户在开发过程中完成短信发送功能的具体实现。
5.1 快速启动
将验证码工具注入到需要使用到验证码的地方
注入代码如下:1
2@Autowired
private CodeProcessorHolder codeProcessorHolder;
5.2 图形验证码
5.2.1 生成图形验证码
在注入一个验证码工具后,通过以下代码即可快速生成一个图形验证码。
具体的示例代码如下:
1 | @GetMapping("/code/image") |
在以上代码后,用户即可通过
获取图形验证码了。
在上述请求中,用户应该将image参数存储起来,因为在校验验证码时需要用到。
5.2.2 验证图形验证码
验证图形验证码的示例代码如下:
1 | @GetMapping("/image/validate") |
用户在验证图形验证码时,即可用过
来判断验证码是否正确。
5.2.3 进阶配置
【注意】上述请求中image参数的值应该与请求中图形验证码的url中的image参数的值保持一致。
特殊提示:对于前后端部署在一起的单体应用,上述两个请求中的image参数都可以省略掉。
针对于图形验证码,组件对图形验证码的生成做一个默认实现,如果生成的图形验证码的内容不满足用户需要,用户可以自定义一个名为 imageCodeGenerator
的实例注入到spring中即可。
实例代码如下
1 | @Component("imageCodeGenerator") |
除此之外,图形验证码相关的配置有
1 | # 验证码的长度,默认为4 |
注意:在上述请求中,验证码的请求参数中的image
参数由yishuifengxiao.code.image.codeKey
属性,image_code
参数由yishuifengxiao.code.image.codeValue
属性决定。在某些极端情况下,可以通过这两个配置修改请求参数。
5.3 邮件验证码
在使用邮箱验证码时,需要先进行下述配置:
- 在项目中导入邮件发送相关的依赖
1 | <dependency> |
- 在项目的配置文件中加入邮件发送相关的配置属性
1 | spring.mail.default-encoding=UTF-8 |
如果不加入以上配置,在使用邮件验证码时会提示 【验证码处理器不存在】,且不能正确发送邮件验证码。
【注意】在阿里云ECS服务器上,25端口默认是关闭的,因此最好配置465端口
5.3.1 发送邮件验证码
邮件验证码的发送代码与图形验证码的发送方法基本一致,只需要将CodeType.IMAGE
改成CodeType.EMAIL
即可。
1 | @GetMapping("/code/email") |
加入上述配置以后,即可通过
发送邮箱验证码了。
5.3.2 验证邮箱验证码
示例代码如下:
1 | @GetMapping("/email/validate") |
加入上述配置以后,即可通过
来验证了。
5.3.3 进阶配置
在邮件验证码功能中,组件对邮箱验证码做了一个缺省性实现,在用户对邮件验证码的格式有自定义需求时,可以通过在spring中注入一个名为emailCodeSender
的实例来实现自己的模板内容。
示例代码如下
1 | @Component("emailCodeSender") |
除此之外,组件还提供了一些额外的配置
1 | # 验证码的长度,默认为4 |
类似地,验证码的请求参数中的email
参数由yishuifengxiao.code.email.codeKeya
属性,email_code
参数由yishuifengxiao.code.email.codeValue
属性决定。
5.4 短信验证码
由于短信验证码的特殊性,不同的短信提供商有不同的发送接口,因此在使用短信验证码功能之前,需要完成自己的名为 smsCodeSender
短信发送器,并将其注入到spring之中。
示例代码如下1
2
3
4
5
6
7
8@Component("smsCodeSender")
public class SmsCodeSender implements CodeSender<SmsCode> {
@Override
public void send(String target, EmailCode emailCode, CodeType codeType){
//实现自己的发送逻辑
}
}
5.4.1 发送短信验证码
在完成前置配置之后,即可发送短信验证码了。
示例代码如下
1 | @GetMapping("/code/sms") |
加入上述配置以后,即可通过
发送邮箱验证码了。
5.4.2 验证短信验证码
示例代码如下:
1 | @GetMapping("/sms/validate") |
加入上述配置以后,即可通过
来验证了。
5.4.3 进阶配置
1 | # 验证码的长度,默认为4 |
类似地,验证码的请求参数中的phone
参数由yishuifengxiao.code.sms.codeKeya
属性,phone_code
参数由yishuifengxiao.code.sms.codeValue
属性决定。
5.5 组件高级配置
在默认情况下,验证码是存在内存中的,由DefaultCodeRepository
进行了一个默认的实现。但是在集群或分布式情况下,此方式显然是不合适的,因此可以加入redis,将验证码存储在redis之中。
具体实现的步骤如下:
1 在项目中加入redis相关的依赖
1 | <dependency> |
2 在配置文件中加入redis相关的配置
1 | spring.redis.host=redis数据库 |
在完成上述配置后,组件会默认使用 RedisCodeRepository
来管理验证码的存取。
总的来说,组件会自动判断系统中有无redis相关的实例加载信息,如果系统中存在redis,会默认使用redis进行验证码管理。
在使用 RedisCodeRepository
进行验证码管理后,redis数据库会在有验证码生成时产生一个key的前缀为 validate_code_
的记录,此记录信息会被自动清理,请勿手动删除该记录,否则会影响验证码组件的功能。
六 spring security功能
在使用spring security时,可以参考以下步骤
- 在项目中加入 spring security依赖
1 | <dependency> |
2 在项目中加入以下代码
下面的代码用户应该保证能被 @ComponentScan
扫描到。1
2
3
4
5
6
7
8
9
10
11
12
13
14@Configuration
@EnableWebSecurity
public class SecurityConfig extends AbstractSecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 调用父类中的默认配置
applyAuthenticationConfig(http);
// 加入自定义的授权配置
authorizeConfigManager.config(http.authorizeRequests());
}
}
该代码的示例代码可参见 com.yishuifengxiao.common.security.SecurityConfig
- 实现
UserDetailsService
接口,完成自己的授权逻辑,并将其注入到spring 之中。
【特别注意】在用户未按照(3)中的步骤配置自己的授权逻辑时,组件会默认进行一个缺省实现。在缺省实现的情况下,用户能使用任意用户名配合密码(12345678)进行登录。
加入上述配置之后,只有组件中内置的默认路径能通过授权,访问其他的url都被重定向到 /index 这个地址,具体的配置及原因请参照后续说明。
6.1 基础配置
1 | # 是否关闭cors保护,默认为false |
在spring security的官方要求中,需要用户在spring security中注入一个 PasswordEncoder
接口的实例,本组件默认采用的是 【易水工具组件】中DES加密,该加密工具是基于DES对称加密算法而来,在本组件中利用其进行加密时的密钥由yishuifengxiao.security.secret-key
的值决定,用户也可以不配此值,使用系统缺省密钥值。
在使用本组件时,推荐使用组件内置的默认加密工具,在用户的系统有特殊的加密需求时,可以通过向spring 中注入一个 名为 passwordEncoder
的 PasswordEncoder
实例来实现自定义加密。
6.2 登陆表单配置
1 | # 表单提交时 默认的用户名参数名字,默认为 username |
对于登陆表单配置相关的参数,系统均有默认值,如无特殊需求,用户可以采用组件的默认值。
在前面的配置中,当用户将spring security的基础设置配置完成后,访问非授权路径会被自动重定向到 /index ,这是由yishuifengxiao.security.core.redirectUrl
这个配置决定的,当用户有特殊需求时,可以配置此属性来配置 非授权路径的重定向地址。
在表单登陆时,用户可以参考下面的表单配置
1 | <form action="/auth/form" method="POST"> |
登录表单中,action提交目标由yishuifengxiao.security.core.formActionUrl
决定,用户名和密码的请求参数分别由 yishuifengxiao.security.core.usernameParameter
和yishuifengxiao.security.core.passwordParameter
决定。
在完成配置后,用户即可通过表单登陆系统了,根据用户参数的正确与否,分别有登录成功处理和登陆失败处理进行不同的管理,关于这两处理器,在后续章节会有明确介绍。
6.3 并发登陆管理
1 | # 同一个用户在系统中的最大session数,默认1 |
当因多终端登录造成前置的登陆用户的登陆状态实现,可以实现 SessionInformationExpiredStrategy
接口并将其注入到spring之中,这样就可以记录由此导致的相关信息了。
6.4 记住我功能
1 | # 记住我产生的token,默认为 yishuifengxiao |
6.5 授权资源管理
授权资源管理是本组件中的重要部分,在本组件中所有的授权资源由以下几部分组成
- 非管理资源
- 匿名资源
- 自定义授权逻辑资源
- 保护资源
也就是说 授权资源 = 非管理资源 + 匿名资源 + 自定义授权逻辑资源 + 保护资源
非管理资源
指的是不经过spring security管理,用户可以不经过授权直接无障碍访问的资源,在本组件中,默认 静态资源和swagger-ui请求路径为 非管理资源
匿名资源
指的是经过spring security管理,但是用户无需登录,通过匿名用户就能访问的资源。
自定义授权逻辑资源
指的的是需要程序根据设定自定决定是否给予访问权限的资源
保护资源
指的是需要用户登陆后才能访问的资源,该部分资源只要用户登陆成功后,无论其权限如何都能访问。
6.5.1 非管理资源
组件中内置的非管理资源的属性配置为
1 | # 是否默认包含静态资源,默认为true |
【特别注意】请勿轻易将yishuifengxiao.security.ignore.containAll属性配置为true,否则组件会给系统中所有的资源给予访问权限。
对于其他需要自定义为非管理资源的路径资源,用户还可以通过以下配置进行扩展
1 | yishuifengxiao.security.ignore.map.demo1=/aaa |
在上面的示例配置中demo1,demo2由用户自行配置,可以配置成任意符合规范的值,这些配置属性的值即为需要配置的资源,多个授权资源间用半角逗号分开。
6.5.2 自定义授权逻辑资源
1 | yishuifengxiao.security.custom.map.demo1=/aaa |
与非管理资源的扩展配置类似,配置中demo1,demo2由用户自行配置,可以配置成任意符合规范的值,这些配置属性的值即为需要配置的资源,多个授权资源间用半角逗号分开。
【特别注意】使用此功能需要用户配置自己的自定义授权提供器,假如用户没有进行配置,组件的缺省实现会将此部分资源直接方形。
自定义授权提供器的实例代码如下:
1 | @Component("customAuthority") |
6.5.3 匿名资源
由于此资源的功能与匿名资源类似,因此组件不提供用户自定义配置功能。
组件默认的匿名资源为
1 | # 权限拦截时默认的跳转地址,默认为/index |
6.5.4 保护资源
在系统中所有的资源,除了非管理资源配置、自定义授权逻辑资源、匿名资源之外,其他所有的资源都需要经过登陆之后才能让访问。
6.6 验证码拦截
首先需要按照 第五章【验证码功能】这一章节中发送验证码所有需要的相关的配置,然后进行如下配置
1 | yishuifengxiao.security.code.filter.image=需要进行图形验证码验证的路径,多个路径之间用半角逗号隔开 |
进行上述配置之后,用户在请求相应的资源时将 第五章【验证码功能】进行验证码验证时需要携带的请求参数放在本请求之后即可。这样就无需使用 第五章【验证码功能】中的方法显式验证了。
此外,用户还可以用 yishuifengxiao.security.code.isFilterGet
属性来修改是否过滤get方法。
6.7 短信登陆
短信登陆是与表单登陆并列的功能。在某些情况下,用户需要开发短信登陆系统功能,本组件也支持此方法。
快速开启
用户可以通过配置以下熟悉开启短信登陆功能
1 | yishuifengxiao.security.code.smsLoginUrl=登陆地址 |
其他配置
1 | # 短信登陆参数,默认为 mobile |
6.8 流程处理器
在本组件中,spring security涉及到的处理有 登陆成功处理、登陆失败处理、 退出成功处理器。
对于本组件中的流程处理器,在流程运行到处理器时,处理器一般有三种处理处理策略
- 返回json格式的数据
- 重定向到指定的url
- 由spring security根据上下文决定返回json格式的数据还是重定向
对于这几种情况,组件抽象了击中处理方式
1 | /** |
对于击中情况下,最终的流程处理方式由项目配置和用户请求参数共同决定:
- 系统配置为 redirect 时,处理器的处理方式为 重定向到指定地址
- 系统配置为 json 时,处理器的处理方式为 返回JSON数据
- 系统配置为 default 时,处理器的处理方式为 由spring security根据上下文决定返回json格式的数据还是重定向
- 系统配置为 auto 时,处理器的处理方式为此时根据用户请求决定,这种配置下,又分为以下几种情况
1) 从请求头中通过制定的参数名(
yishuifengxiao.security.handler.headerName
属性决定)获取处理方式
2) 判断请求中Accept请求头是否包含了json关键字,如果包含则流程处理器的处理方式为 json
3) 从请求的url中获取指定参数(yishuifengxiao.security.handler.paramName
属性决定)的值,根据参数获取处理方式
4) 当前三步中未获取到明确的处理方式时,设置默认的处理方式为 redirect
这些属性的系统配置如下:
1 | # 默认的header名称 type |
6.8.1 登陆成功处理器
1 | # 流程处理器处理方式 |
6.8.2 登陆失败处理器
1 | # 流程处理器处理方式 |
6.8.3 退出失败处理器
1 | # 流程处理器处理方式 |
七 OAuth2功能
使用oauth2功能首先需要按照第六章中的步骤开启spring security的相关功能。
快速启动
1 在项目中加入oauth相关的依赖
1 | <dependency> |
2 在项目加入以下代码
1 | @Configuration |
3 加上@EnableResourceServer
和 @EnableAuthorizationServer
注解
完全开启示例代码如下:
1 | @Configuration |
4 实现UserDetailsService
接口,完成自己的认证逻辑
【特别注意】在用户未按照(4)中的步骤配置自己的授权逻辑时,组件会默认进行一个缺省实现。在缺省实现的情况下,用户能使用任意用户名配合密码(12345678)进行登录
7.1 四种授权方式
7.1.1 密码模式
1 | POST /oauth/token HTTP/1.1 |
在请求中,各参数的含义如下
- grant_type:表示授权类型,此处的值固定为”password”,必选项。
- username:表示用户名,必选项。
- password:表示用户的密码,必选项。
- scope:表示权限范围,可选项。
- Authorization: 请求头参数 ,值是 clientId:clientSecret经过base64编码后的值
下面是一个响应的例子
1 | { |
7.1.2 客户端模式
1 | POST /oauth/token HTTP/1.1 |
在本请求中,各参数的含义如下
- grant_type:表示授权类型,此处的值固定为”client_credentials”,必选项。
- Authorization: 请求头参数 ,值是 clientId:clientSecret经过base64编码后的值
下面是一个响应的例子
1 | { |
同密码模式相比,客户端模式的响应中缺少了
refresh_token
参数7.1.3 授权码模式
授权码模式首先需要保证spring security的登陆功能正常可用。只有开启spring security的登陆功能可用,才能开启授权码功能。
先访问一下请求
1 | GET /oauth/authorize?response_type=code&client_id=yishui&state=xyz&redirect_uri=http://demo.yishuifengxiao.com/demo HTTP/1.1 |
在本请求中,各参数的含义如下:
- code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
- state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
- client_id: 用户的client_id
在进行此请求时,假如用户没有登录,spring security会进行拦截,因此需要用户先进行登录。
在正常情况下,访问以上请求会被重定向到
http://demo.yishuifengxiao.com/demo?code=fsfsdf
&state=xyz
服务器回应客户端的URI,包含以下参数:
- code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
- state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
通过上面的请求得到了code
以后,用户需要使用下面请求获取到授权码
1 | POST /oauth/token HTTP/1.1 |
在本请求中,各参数的含义如下:
- grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
- code:表示上一步获得的授权码,必选项。
- redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
- client_id:表示客户端ID,必选项。
7.1.4 简化模式
1 | GET /oauth/authorize?response_type=token&client_id=yishui&state=xyz |
在本请求中,各参数的含义如下:
- response_type:表示授权类型,此处的值固定为”token”,必选项。
- client_id:表示客户端的ID,必选项。
- redirect_uri:表示重定向的URI,可选项。
- scope:表示权限范围,可选项。
- state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
7.1.5 刷新token
1 | POST /oauth/token HTTP/1.1 |
请求中个参数的含义:
- granttype:表示使用的授权模式,此处的值固定为”refreshtoken”,必选项。
- refresh_token:表示早前收到的更新令牌,必选项。
- scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。
7.2 access_token使用
通过7.1 中的方法获取到access_token之后,一般有两种使用方法
- 将access_token做为请求参数携带在url参数上
http://demo.yishuifengxiao.com/user/123?access_token=获得到的access_token
- 将access_token做为请求参数放在请求头中
在所有需要授权的请求的请求头里都携带上参数
Authorization=Bearer 获得到的access_token
在通用组件中,由于对access_token
进行了深度处理,因此用户可以access_token
通过易水工具包里的DES工具饭解析出token里携带的信息。
在解密时需要使用的密钥由 6.1中设置的yishuifengxiao.security.secret-key
属性值决定。
下面是一个 access_token
的解密信息示例
1 | { |
解密信息的各参数的解释:
- username: 用户登录时使用到的用户名(在客户端模式下该值为空)
- clientId: 用户登录时使用的clientId(在简化模式下该值为空)
- roles: 此登录用户拥有的角色(即此用户的authorities)
- grantType:access_token对应的授权类型
由
access_token
反解析出用户信息仅限于本组件,原生的oauth2的access_token
不支持此功能
7.3 授权资源管理
7.3.1 基础概念
oauth2中的授权资源与spring security中授权资源既有重合又有不同的地方。对于spring security中非管理资源和自定义授权逻辑资源以及匿名资源的概念依然保持一致,但是这些资源的范围略有差异,并且增加 游离资源的概念。
非管理资源
与spring security中的非管理资源的概念一致,其范围也由spring security中的非管理资源配置决定
自定义授权逻辑资源
与spring security中的自定义授权逻辑资源的概念一致,其范围也由spring security中的自定义授权逻辑资源配置决定
匿名资源
与spring security中的匿名资源的概念一致,但oauth2中内置匿名资源的范围较小
目前仅包含以下两个部分,且不能由用户定义。1
2
3
4# 权限拦截时默认的跳转地址,默认为/index
yishuifengxiao.security.core.redirectUrl=/index
# session失效时跳转的地址
yishuifengxiao.security.session.sessionInvalidUrl=/session/invalid
保护资源
与spring security中的保护资源的概念一致
游离资源
需要经过spring security权限管理,但是不在oauth2权限管理范围之内,它依旧是spring security中保护资源的一部分。
在oauth2的资源体系中
1 | 所有资源 = 非游离资源 + 游离资源 |
7.3.2 游离资源
组件里默认游离资源资源为
- /oauth/**
- yishuifengxiao.security.handler.suc.redirectUrl=/
- yishuifengxiao.security.core.formActionUrl=/auth/form
- yishuifengxiao.security.core.loginOutUrl=/loginOut
- yishuifengxiao.social.filterProcessesUrl+/+yishuifengxiao.social.qq.providerId
- yishuifengxiao.social.filterProcessesUrl+/+yishuifengxiao.social.weixin.providerId
除了这些默认的系统配置外,用户还可以根据项目需要配置自己的资源路径
1 | yishuifengxiao.security.oauth2.map.demo1=/aaa |
在上面的示例配置中demo1,demo2由用户自行配置,可以配置成任意符合规范的值,这些配置属性的值即为需要配置的资源,多个授权资源间用半角逗号分开。
7.4 流程处理器
与spring security相比,oauth2在spring security的基础上增加两个流程处理器 权限拒绝处理器 和 资源异常处理器。他们的处理逻辑与spring security中流程处理器的逻辑完全一致,因此在这里不做过多介绍。
权限拒绝处理器 一般会在用户无权访问资源(如401)的情况下触发,其配置如下
1 | yishuifengxiao.security.handler.denie.returnType=atuo |
资源异常处理器 一般在用户访问资源时忘记携带token或者携带的token信息已过期的情况下触发。
1 | yishuifengxiao.security.handler.exception.returnType=atuo |
八 spring social
使用spring social功能首先需要按照第六章中的步骤开启spring security的相关功能。
8.1 快速启动
1 在项目的pom里增加spring social相关的依赖
1 | <dependency> |
2 在项目的任意一个 @Configuration
下增加 @EnableSocial
注解
3 将SpringSocialConfigurer
的实例对象注入到spring security之中。
4 在属性配置文件增加相关的配置
一个完整的配置文件的示例如下:
1 | @Configuration |
8.2 QQ登录
开启QQ登录首先需要在 QQ互联 申请账号和密码
接下来,在项目的配置文件里增加以下配置
1 | # spring social拦截器拦截的标志 |
在完成上述配置 ,访问
http://ip:port/callback/qq
即可进行QQ登录流程了
注意:
访问的的url中的/callback/qq由yishuifengxiao.social.filter-processes-url和yishuifengxiao.social.qq.providerId两部分共同组成。
8.3 微信登录
配置微信登录只需要在上述基础上进行一下配置即可
1 | # 微信登录的appId |
在完成上述配置 ,访问
http://ip:port/callback/weixin
即可进行微信登录流程了
8.4 账号绑定
在完成QQ登录或者微信登录后,就可将微信(QQ)用户与本系统的用户绑定了。
绑定的关键代码如下:
- 注入 ProviderSignInUtils 工具
1 | @Autowired |
2 开始绑定
1 | providerSignInUtils.doPostSignUp("本系统用户ID",new ServletWebRequest(request)); |