什么是oAuth2
简单来说,就是让一个系统可以直接访问另一个系统,通过授权码。
与单点登录的区别
什么是单点登录: 用户成功登录A系统,需要访问B系统时,可以不用输入用户名密码进行认证就可以直接访问B系统的资源。
什么是oauth2: A系统征求用户的同意后直接访问B系统,用户不需要登录也不需要访问B系统。
四种授权模式
1)授权码模式(oauth2 中最安全最完善的一种模式,应用场景最广泛)
A系统要访问B系统的资源,A系统询问用户是否同意其访问B系统的资源。如果用户同意,则B系统生成授权码给A,A系统带着授权码向B系统发送请求,并获取到令牌 token 和更新令牌 refresh token。(前提:用户有访问B系统的权限)
2)简化模式
跟授权码模式类似,去掉了授权码。直接获得B系统给的 token ,通过 token 访问B系统
3)密码模式
用户直接把自己访问B系统的账号密码告诉 A系统,A系统拿着用户的密码去访问B系统。
4)客户端模式
A系统直接脱离用户,以自己的身份去B系统获取 token,可以说完全是 AB 系统内部的交互,与用户无关了。该模式不太属于 oauth2 范畴
OAuth2表结构
oAuth2 自带有 7 张表
注意:这里的 sql 默认是 HSQLDB 的,我们用 mysql 的可以把 LONGVARBINARY 数据类型改成 BLOB
oauth_client_details
是核心表,后面测试时只要看这张表即可
表结构字段说明可参考博客 https://blog.youkuaiyun.com/qq_34997906/article/details/89609297
创建父工程
本文只贴 配置类代码,其他具体代码跟上一篇博客类似,具体可查看文末源码
注意 spring cloud 的版本匹配,本例用的 springboot2.3,可参考 https://start.spring.io/actuator/info
创建认证模块
即 B 系统的 oauth2 认证模块,B系统需要检测用户是否登录,用户成功登录了B系统才能授权给A系统去访问
@Configuration
@EnableWebSecurity
public class SpringsecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SysUserService userService;
//配置加密
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); //spring security 内置加密算法
}
//认证用户的来源
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}
//Spring Security配置
public void configure(HttpSecurity hs) throws Exception {
hs.authori