OAuth2:单点登陆客户端

article/2025/9/3 10:14:17

基于@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路径,每个服务单独设置,就不会打架了

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


http://chatgpt.dhexx.cn/article/ft2tu7hb.shtml

相关文章

单点登陆概述

概述 什么是单点登陆 单点登陆&#xff08;single sign on&#xff09;&#xff0c;简称SSO&#xff0c;是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中&#xff0c;用户只需要登陆一次就可以访问所以相互信任的应用系统。 单点登陆的实现方案 一般…

怎么做登陆(单点登陆)功能?

登陆是系统最基础的功能之一。这么长时间了&#xff0c;一直在写业务&#xff0c;这个基础功能反而没怎么好好研究&#xff0c;都忘差不多了。今天没事儿就来撸一下。 以目前在接触的一个系统为例&#xff0c;来分析一下登陆该怎么做。 简单上个图&#xff08;有水印。因为穷所…

SSO单点登陆

1 SSO简介 1.1 什么是SSO 单点登录(SingleSignOn&#xff0c;SSO)&#xff0c;在多个应用系统中&#xff0c;用户只需一次登录就可以访问所有相互信任的应用系统。单点登录常用的协议包括 CAS、OAuth、OpenID Connect、SAML。 例如&#xff1a;百度旗下有很多的产品&#xff…

sso单点登陆实现

多系统实现单点登录方案&#xff1a;SSO 单点登录 一、什么是单点登录SSO&#xff08;Single Sign-On&#xff09; SSO是一种统一认证和授权机制&#xff0c;指访问同一服务器不同应用中的受保护资源的同一用户&#xff0c;只需要登录一次&#xff0c;即通过一个应用中的安全验…

单点登陆和无状态登陆

很多人都听说过单点登陆。今天我们来说说什么是单点登陆和无状态登陆。 传统的项目都是使用session来验证登陆&#xff0c;但是在分布式项目中使用session是不行的。因为每个服务都是一个独立的项目&#xff0c;那么我们将服务拆分&#xff0c;肯定会有一个登陆的模块。如果将用…

windows文件句柄修改

找到如下注册表分支&#xff1a; HKEY_LOCAL_MACHINE – SOFTWARE – – Microsoft – – – Windows NT – – – – CurrentVersion – – – – – Windows 在右侧窗格中可以看到名为“GDIProcessHandleQuota”与“USERProcessHandleQuota”的注册表项; GDIProcessHandleQuo…

Linux 查看文件句柄信息

查看系统的最大文件句柄数和文件句柄的使用者PID ulimit -n查看当前系统的最大句柄数显示如下 ulimit命令详解 ulimit -HSn x设置当前系统的文件句柄数为x 以上命令中&#xff0c;H指定了硬性大小&#xff0c;S指定了软性大小&#xff0c;n表示设定单个进程最大的打开文件句柄…

Windows查看文件句柄

2019独角兽企业重金招聘Python工程师标准>>> 图形界面方式 打开任务管理器 2. 性能tab,点击链接打开资源监视器; 3. 现在cpu tab,关联的句柄后面的输入框可以输入你要搜索的文件路径,可模糊匹配; 命令方式 Windows系统本身并不内置命令查看句…

linux文件句柄数

1、问题阐述&#xff1a; too many open files&#xff1a;顾名思义即打开过多文件数。 不过这里的files不单是文件的意思&#xff0c;也包括打开的通讯链接(比如socket)&#xff0c;正在监听的端口等等&#xff0c;所以有时候也可以叫做句柄(handle)&#xff0c;这个错误通常…

windows 查看打开的文件句柄

经常当我们删除文件时&#xff0c;有时会提示【操作无法完成&#xff0c;因为文件已在另一个程序中打开&#xff0c;请关闭该文件并重试】&#xff0c; 这个时候可以资源监控器进行查看运行的进程打开的句柄列表。 具体结果如下显示&#xff1a;

Linux下文件句柄

Too many open files 如果Java打开文件的时候&#xff0c;没有关闭IO流&#xff0c;那么打开到一定数量&#xff0c;在Linux下就会抛出Too many open files的异常。 public static class HoldIOTask implements Runnable {Overridepublic void run() {int count0;try {while(t…

【Linux】文件句柄说明

Linux 文件句柄说明 Linux中所有的事物或资源都是以文件的形式存在&#xff0c;比如消息、共享内存、连接等&#xff0c;句柄可以理解为指向这些文件的指针。 对于这些句柄&#xff0c;Linux是有数量限制的&#xff0c;单个进程默认可以打开的句柄数上限&#xff0c;可以用以…

windows 文件句柄查询

windows经常出现删除/剪切文件时提示文件被占用的问题 打开任务管理器&#xff0c; 选择“性能”选项卡 2. 打开资源管理器&#xff0c; 在关联句柄查询框中输入关键字&#xff0c;过滤查询&#xff0c;然后右键选中对应项&#xff0c;结束任务即可释放句柄

文件句柄

一、文件句柄是什么&#xff1f; 对象在内存中是经常来回移动的&#xff0c;如何快速定位找到这个对象呢&#xff1f; 句柄说&#xff1a; “我来帮你找” windows系统给出的方案 1.进程创建时&#xff0c;windows系统为进程构造了一个句柄表 2.当该进程希望获得一个内核对…

linux开关机命令

shutdown -h now/或者是具体的时间hh:mm&#xff1b; 关机; -h:关机。&#xff1b;-r&#xff1a; 重启 &#xff1b;-c&#xff1a; 取消前一个关机命令。一般就只用shutdown这个命令&#xff1b;halt&#xff0c;poweroff&#xff0c;init 0 关机&#xff1b;init 6&#xff…

Linux命令之关机命令

shutdown命令可以用来进行关闭系统&#xff0c;并且在关机以前传送讯息给所有使用者正在执行的程序&#xff0c;shutdown 也可以用来重开机使用者权限&#xff1a;管理员用户 语法如下&#xff1a; shutdown [-t seconds] [-rkhncfF] time [message] 参数说明&#xff1a; …

Linux 关机 命令

一、正确的关机方法 如果直接按下电源开关&#xff0c;数据有可能中断。若不正常关机&#xff0c;则有可能造成文件系统的损毁。因此&#xff0c;正常关机情况下&#xff0c;应注意以下&#xff1a; 1&#xff09;查看系统的使用状态 查看目前有谁在线&#xff0c;使用“who…

部署图详解

部署图 一、部署图概要 ​ 部署图用于静态建模&#xff0c;是表示运行时过程节点结构、构件实例及其对象结构的图。如果含有依赖关系的构件实例放置在不同节点上&#xff0c;部署视图可以展示出执行过程中的瓶颈。部署图的两种表现形式&#xff1a;实例层部署图和描述层部署图…

EA_画部署图

EA_画部署图 新建部署图增加个性化图标画一个范围Boundary 新建部署图 右键–>添加图 增加个性化图标 右键图标–>外观–>选择可替代图像 选择自定义的图标 画一个范围Boundary

UML-----构件图与部署图

构件图和部署图这两个图都属于实现图。它是用来描述实现方面的信息。构件图用来显示一组构件之间的组织及依赖关系&#xff1b;而部署图则用来描述系统硬件的物理拓扑结构以及在此结构神执行的软件。 构件图 构件图是从软件结构的角度来描述一个系统的主要功能&#xff0c;如子…