基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践相关的知识,希望对你有一定的参考价值。

参考技术A

理论知识

在此之前需要学习和了解一些前置知识包括:

要完成的目标

基于此目标驱动,本文设计三个独立服务,分别是:

多模块(Multi-Module)项目搭建

三个应用通过一个多模块的 Maven项目进行组织,其中项目父 pom中需要加入相关依赖如下:

项目结构如下:

项目结构

授权认证中心搭建

授权认证中心本质就是一个 Spring Boot应用,因此需要完成几个大步骤:

即让授权中心服务启动在本地的 8085端口之上

这里创建了一个用户名为codesheep,密码 123456的模拟用户,并且赋予了 普通权限 (ROLE_NORMAL)和 中等权限 (ROLE_MEDIUM)

这里做的最重要的两件事: 一是 定义了两个客户端应用的通行证(sheep1和sheep2); 二是 配置 token的具体实现方式为 JWT Token。

客户端应用创建和配置

本文创建两个客户端应用:codesheep-client1 和codesheep-client2,由于两者类似,因此只以其一为例进行讲解

复杂的东西都交给注解了!

这里几项配置都非常重要,都是需要和前面搭建的授权中心进行通信的

此测试控制器包含三个接口,分别需要三种权限(ROLE_NORMAL、ROLE_MEDIUM、ROLE_ADMIN),待会后文会一一测试看效果

实验验证

首先用浏览器访问客户端1 (codesheep-client1) 的测试接口:localhost:8086/normal,由于此时并没有过用户登录认证,因此会自动跳转到授权中心的登录认证页面:http://localhost:8085/uac/login:

自动跳转到授权中心统一登录页面

输入用户名 codesheep,密码 123456,即可登录认证,并进入授权页面:

授权页面

同意授权后,会自动返回之前客户端的测试接口:

自动返回客户端接口并调用成功

此时我们再继续访问客户端1 (codesheep-client1) 的测试接口:localhost:8086/medium,发现已经直接可以调用而无需认证了:

直接访问

由于 localhost:8086/normal 和 localhost:8086/medium要求的接口权限,用户codesheep均具备,所以能顺利访问,接下来再访问一下更高权限的接口:localhost:8086/admin:

无权限访问

好了,访问客户端1 (codesheep-client1) 的测试接口到此为止,接下来访问外挂的客户端2 (codesheep-client2) 的测试接口:localhost:8087/normal,会发现此时会自动跳到授权页:

由于用户已通过客户端1登录过_因此再访问客户端2即无需登录_而是直接跳到授权页

授权完成之后就可以顺利访问客户端2 (codesheep-client2) 的接口:

顺利访问客户端2的接口

这就验证了单点登录SSO的功能了!

以上是关于基于Spring Security Oauth2的SSO单点登录+JWT权限控制实践的主要内容,如果未能解决你的问题,请参考以下文章

spring security oauth2 禁用基于 jsessionid 的会话

spring security oauth2 认证端异常处理(基于前后分离统一返回json)

Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定

Eurynome Cloud Athena 基于Spring Security OAuth2 的前后端分离脚手架

使用 oAuth2.0 和表单登录的 Spring Security

Spring Security OAuth2.0认证授权