基于@EnableOAuth2Sso实现

前面我们将验证服务器已经搭建完成了,现在我们就来实现一下单点登陆吧,SpringCloud为我们提供了客户端的直接实现,我们只需要添加一个注解和少量配置即可将我们的服务作为一个单点登陆应用,使用的是第四种授权码模式。

一句话来说就是,这种模式只是将验证方式由原本的默认登录形式改变为了统一在授权服务器登陆的形式。

首先还是依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId><version>2.2.5.RELEASE</version>
</dependency>

我们只需要直接在启动类上添加即可:

@EnableOAuth2Sso
@SpringBootApplication
public class BookApplication {public static void main(String[] args) {SpringApplication.run(BookApplication.class, args);}
}

我们不需要进行额外的配置类,因为这个注解已经帮我们做了:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableOAuth2Client
@EnableConfigurationProperties({OAuth2SsoProperties.class})
@Import({OAuth2SsoDefaultConfiguration.class, OAuth2SsoCustomConfiguration.class, ResourceServerTokenServicesConfiguration.class})
public @interface EnableOAuth2Sso {
}

可以看到它直接注册了OAuth2SsoDefaultConfiguration,而这个类就是帮助我们对Security进行配置的:

@Configuration
@Conditional({NeedsWebSecurityCondition.class})
public class OAuth2SsoDefaultConfiguration extends WebSecurityConfigurerAdapter {//直接继承的WebSecurityConfigurerAdapter,帮我们把验证设置都写好了private final ApplicationContext applicationContext;public OAuth2SsoDefaultConfiguration(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}

接着我们需要在配置文件中配置我们的验证服务器相关信息:

security:oauth2:client:#不多说了client-id: webclient-secret: 654321#Token获取地址access-token-uri: http://localhost:8500/sso/oauth/token#验证页面地址user-authorization-uri: http://localhost:8500/sso/oauth/authorizeresource:#Token信息获取和校验地址token-info-uri: http://localhost:8500/sso/oauth/check_token

现在我们就开启图书服务,调用图书接口:

可以看到在发现没有登录验证时,会直接跳转到授权页面,进行授权登录,之后才可以继续访问图书服务:

那么用户信息呢?是否也一并保存过来了?我们这里直接获取一下SpringSecurity的Context查看用户信息,获取方式跟我们之前的视频中讲解的是一样的:

@RequestMapping("/book/{bid}")
Book findBookById(@PathVariable("bid") int bid){//通过SecurityContextHolder将用户信息取出SecurityContext context = SecurityContextHolder.getContext();System.out.println(context.getAuthentication());return service.getBookById(bid);
}

再次访问图书管理接口,可以看到:

这里使用的不是之前的UsernamePasswordAuthenticationToken也不是RememberMeAuthenticationToken,而是新的OAuth2Authentication,它保存了验证服务器的一些信息,以及经过我们之前的登陆流程之后,验证服务器发放给客户端的Token信息,并通过Token信息在验证服务器进行验证获取用户信息,最后保存到Session中,表示用户已验证,所以本质上还是要依赖浏览器存Cookie的。

接下来我们将所有的服务都使用这种方式进行验证,别忘了把重定向地址给所有服务都加上:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("web").secret(encoder.encode("654321")).autoApprove(true)   //这里把自动审批开了,就不用再去手动选同意了.scopes("book", "user", "borrow").redirectUris("http://localhost:8101/login", "http://localhost:8201/login", "http://localhost:8301/login").authorizedGrantTypes("client_credentials", "password", "implicit", "authorization_code", "refresh_token");
}

这样我们就可以实现只在验证服务器登陆,如果登陆过其他的服务都可以访问了。

但是我们发现一个问题,就是由于SESSION不同步,每次切换不同的服务进行访问都会重新导验证服务器去验证一次:

这里有两个方案:

  • 像之前一样做SESSION统一存储
  • 设置context-path路径,每个服务单独设置,就不会打架了

但是这样依然没法解决服务间调用的问题,所以仅仅依靠单点登陆的模式不太行。

OAuth2:单点登陆客户端相关推荐

  1. Spring Security、oauth2、单点登陆SSO的关系

    文章目录 概述 1. 什么是Spring Security 1.1 配置示例 1.2 spring security 基本原理 1.2 Spring Security存在的问题 2. 什么是oauth ...

  2. 08-微服务版单点登陆系统(SSO)实践

    文章目录 单点登陆系统简介 背景分析 单点登陆系统概述 单点登陆系统解决方案设计 单点登陆系统初步设计 服务设计 工程结构设计 SSO父工程创建及初始化 创建父工程 父工程pom文件初始配置 系统基础 ...

  3. 社交登陆,分布式session,单点登陆,jwt

    社交登陆,分布式session,单点登陆,jwt 一.社交登录 QQ. 微博. github 等网站的用户量非常大, 别的网站为了简化自我网站的登陆与注册逻辑, 引入社交登陆功能: 步骤: 1) . ...

  4. 09-微服务版的单点登陆系统设计及实现(2105~2106)

    文章目录 简介 背景分析 单点登陆系统 快速入门实践 工程结构如下 创建认证授权工程 添加项目依赖 构建项目配置文件 添加项目启动类 启动并访问项目 自定义登陆逻辑 业务描述 定义安全配置类 定义用户 ...

  5. 鉴权,开放式授权,单点登陆

    鉴权,开放式授权,单点登陆 鉴权 鉴权(authentication)是指验证用户是否拥有访问系统的权利.传统的鉴权是通过密码来验证的.这种方式的前提是,每个获得密码的用户都已经被授权.在建立用户时, ...

  6. 五、微服务版单点登陆系统(SSO)

    微服务版单点登陆系统(SSO)实践 文章目录 微服务版单点登陆系统(SSO)实践 一.单点登陆系统简介 1. 背景分析 2. 单点登陆系统概述 3. 单点登陆系统解决方案设计 二.单点登陆系统初步设计 ...

  7. 微服务版单点登陆系统(SSO)

    单体架构中的用户的状态的存储是如何实现的? 单点登陆系统概述 单点登录,英文是 Single Sign On(缩写为 SSO).即多个站点共用一台认证授权服务器,用户在其中任何一个站点登录后,可以免登 ...

  8. 09-微服务版单点登陆系统(SSO)实践

    目录 单点登陆系统简介 背景分析 单点登陆系统概述 单点登陆系统解决方案设计 单点登陆系统初步设计 服务设计 工程结构设计 SSO父工程创建及初始化 创建父工程 父工程pom文件初始配置 系统基础服务 ...

  9. 微服务版单点登陆系统(SSO)实践

    文章目录 认证步骤 JWT令牌组成 auth项目 自定义令牌类型 resource项目 单点登陆系统简介 背景分析 单点登陆系统概述 单点登陆系统解决方案设计 单点登陆系统初步设计 服务设计 工程结构 ...

最新文章

  1. 三极管形象经典的理解
  2. 服务器安装Windows Server + Ubuntu双系统
  3. Python 错误和异常
  4. (JAVA)Random类
  5. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom
  6. cmd查看所有数据库 db2_db2 cmd命令操作
  7. 我在30岁之前做了三件骄傲的事
  8. Qt 学习之路 2(2):Qt 简介 笔记
  9. JS对数组对象按照某个字段进行排序
  10. 阿里编码规范认证考试题库(免费版)
  11. [笔记分享] [RPM] RPM T32 dump方法
  12. OPPO小布4.0:软件定义硬件,智能定义“助手”
  13. python+opencv实现人脸识别|采用现成训练好的模型
  14. 我在做售前-5.如何应聘售前
  15. Population and carrying capacity 的第三个阶段:Crowding affects births
  16. 计算机在艺术娱乐的应用,计算机技术在艺术领域的应用
  17. nslookup命令使用技巧
  18. 喜报 | 荣获中国产学研合作促进奖
  19. matlab 分式拟合,matlab 微分方程组的参数拟合
  20. android cursor

热门文章

  1. TIME-FREQUENCY ATTENTION FOR MONAURAL SPEECH ENHANCEMENT
  2. HTML tag(标签)用法
  3. 番外10:使用ADS对射频功率放大器进行非线性测试2(使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试)
  4. Flutter开发(十七):Flutter首页导航的框架
  5. FANUC 实用软件简介
  6. SIMetrix教程-001.SIMetrix软件简介与安装
  7. cpu设计和实现(协处理器hi和lo)
  8. 数控采集002:体验华中数控Demo演示程序
  9. 谷歌官方推荐《Android开发入门精编》,极致经典,堪称Android入门教程的天花板
  10. 在 Mac 上重命名 Apple Magic Mouse的方法!