sso 四种授权模式

 单点登录

单点登录,英文是 Single Sign On(缩写为 SSO)。即多个站点共用一台认证授权服务器,用户在站点登录后,可以免登录访问其他所有站点。而且,各站点间可以通过该登录状态直接交互。例如:

业务逻辑的使用

鉴权:

网关鉴权 微服务

没有 需要

鉴权 补充

CAS 是 Central Authentication Service 的缩写 —— 中央认证服务,一种独立开放指令协议,是 Yale 大学发起的一个企业级开源项目,旨在为 Web 应用系统提供一种可靠的 SSO 解决方案。

SSO是一种思想,而CAS只是实现这种思想的一种框架而已

CAS支持oauth2 协议

SSO是一种思想,或者说是一种解决方案,是抽象的,我们要做的就是按照它的这种思想去实现它

OAuth2是用来允许用户授权第三方应用访问他在另一个服务器上的资源的一种协议,它不是用来做单点登录的,但我们可以利用它来实现单点登录。

OAuth2

1 介绍

OAuth2是目前最流行的授权机制,用来授权第三方应用,获取用户数据。允许用户授权B应用不提供帐号密码的方式去访问该用户在A应用服务器上的某些特定资源。

2 oauth2.0四个角色

四个角色:

resource owner:资源所有者,这里可以理解为用户。

client:客户端,可以理解为一个第三方的应用程序 即微博 CSDN。

resource server:资源服务器,它存储用户或其它资源。

authorization server:

认证/授权服务器,它认证resource owner的身份,为 resource owner提供授权审批流程,并最终颁发授权令牌(Access Token)。

认证服务器只有一个 sysauth

资源服务器 订单 商品 支付

认证的流程

3 四种授权模式

* authorization_code 授权码模式

* password 密码模式

* implicit 简单模式

* client_credentials 客户端模式

* refresh_token 这个不是一种模式 是支持刷新令牌的意思

1 授权码模式

一般用于提供给第三方使用

2 简单模式

一般不会使用

3 密码模式

一般仅用于系统内部使用

4 客户端模式

一般不会使用

4 OAUTH2的spring cloud 微服务单点登录

用户:就是注册的用户

客户端:就是我们的前端项目

授权服务器:我们可以专门在后台创建一个专门管授权的微服务

资源微服务:像其他的订单微服务,什么搜索微服务拉都可以看做用户能够访问的资源

如果我们自己去用java实现OAUTH2.0标准,太麻烦了,幸好有spring-security-oauth2这个插件,就简单多了,spring-security-oauth2是基于spring-security框架完整实现oauth2协议的框架,具有oauth2中4种模式访问和第三方登录等功能。

 四种模式测试

所有授权端点(EndterPoints),意思就是授权微服务启动后 可以访问哪些路径

认证服务器的ip以及端口号 localhost:8500

localhost:8500/oauth/token

路径

说明

/oauth/authoriz

授权端点

/oauth/token

令牌端点 获取token

/oauth/confirm_access

用户确认授权提交端点

/oauth/error

授权服务错误信息端点

/oauth/check_token

用于资源服务访问的令牌解析端点

/oauth/token_key

提供公有密匙的端点,如果你使用JWT(RSA)令牌的

5 spring cloud alibaba 使用oauth2

1 创建父项目

2 启动nacos

3 创建授权微服务sys-auth

pom文件:

<dependency>

<groupId>org.springframework.security.oauth</groupId>

<artifactId>spring-security-oauth2</artifactId>

<version>2.3.5.RELEASE</version>

</dependency>

<dependency>

<groupId>com.squareup.okhttp3</groupId>

<artifactId>okhttp</artifactId>

</dependency>

<!--security使用的jwt-->

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-jwt</artifactId>

<version>1.1.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

授权码模式

1.配置核心的配置文件

授权的配置信息需要继承AuthorizationServerConfigurerAdapter

将授权的客户端的信息保存到内存里面

2.配置springsecurity的配置信息

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().permitAll();http.authorizeRequests().antMatchers("/userlogin","/oauth/**").permitAll();// 代表放行 "/login.html","/userlogin","/"http.authorizeRequests().anyRequest().authenticated();//  csrf  方便html 文件  能够通过http.csrf().disable();http.cors();//跨域}@Resource
private  BCryptPasswordEncoder passwordEncoder;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("aaa").password(passwordEncoder.encode("123456")).roles("ADMIN");
//        auth.userDetailsService(userDetailsService).passwordEncoder(getPassword());}public void printJsonData(HttpServletResponse response, Result result) {try {response.setContentType("application/json;charset=utf8");  // json格式   编码是中文ObjectMapper objectMapper = new ObjectMapper();String s = objectMapper.writeValueAsString(result);// 使用ObjectMapper将result转化json为字符串PrintWriter writer = response.getWriter();writer.print(s);writer.flush();writer.close();}catch (Exception e){e.printStackTrace();}}
}

3.访问授权站点


 

访问后登录 

登录后获得授权码

4. 根据授权码生成token

localhost:8500/oauth/token?grant_type=authorization_code&code=4WXzET&client_id=admin&redirect_url=http://www.baidu.com&scope=all

登录

获得token

简单模式:

修改oauth2

访问登录

localhost:8500/oauth/authorize?response_type=token&client_id=admin&scope=all

获得token

客户端模式:

登录访问

获得token

密码模式 

修改springsecurity的配置信息

修改oauth2配置信息

获得token

不想重复的输入第三方的用户名和密码放行

校验token

jwt类型的token

加jar

dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

配置bean

使用bean

认证之后直接生成token

安全配置文件中配置认证成功之后使用第三方工具 hutool 发出post请求  生成token 返回客户端

资源服务器

1.添加jar包

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security.oauth.boot/spring-security-oauth2-autoconfigure -->
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.3.5.RELEASE</version>
</dependency>

2.编写controller

3.编写bootstrap

4.添加配置中心

5.配置config文件

package com.example.controller.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(jsr250Enabled = true,prePostEnabled = true,securedEnabled=true)
public class MyResConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated()//.access("@RbacConfig.hasPermission(request,authentication)").and().csrf().disable();}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(jwtAccessTokenConverter());}@Beanpublic JwtAccessTokenConverter jwtAccessTokenConverter(){JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();jwtAccessTokenConverter.setSigningKey("test"); // return jwtAccessTokenConverter;}
}

测试token是否生效

携带token 访问资源服务器

Authorization  放在headers里面的

Token的值 要求必须是bearer 类型的 token前面加上这个类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#编程题分享(3)

n的阶乘问题 输⼊整数n&#xff0c;输出n的阶乘。 int n Convert.ToInt32(Console.ReadLine()); int jiecheng 1; for (int i 1; i < n 1; i) {jiecheng * i; // 1 * 2 * 3 * .....} Console.WriteLine("{0}的阶乘是&#xff1a;{1}", n, jiecheng); q^n次…

Clickhouse设置多磁盘存储策略

设置多磁盘存储 clickhouse安装完成以后&#xff0c;配置了一个默认的存储空间&#xff0c; 这个只能配置一个目录&#xff0c;如果要使用多个磁盘目录&#xff0c;则需要配置磁盘组策略 查看当前的存储策略 select name, path, formatReadableSize(free_space) as free, fo…

Django DRF版本号的处理

在restful规范中&#xff0c;后端的API中需要体现版本。如果项目比较大&#xff0c;需要些很多的视图类&#xff0c;在每一个类中都写一遍会比较麻烦&#xff0c;所以drf中也支持了全局配置。在每个版本处理的类中还定义了reverse方法&#xff0c;他是用来反向生成URL并携带相关…

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

Arduino驱动MLX90614红外温度传感器(温湿度传感器)

目录 1、传感器特性 2、MLX90614发射率补偿方法 3、控制器和传感器连线图 4、驱动程序 MLX90614红外测温模块,通过探测物体红外辐射能量的大小和波长的分布来检测物体的表面温度。红外测温器由光学系统、光电探测器、信号放大器

一文读懂 Linux mmap

文章目录 1.简介2.实现原理3.相关函数4.mmap和常规文件操作的区别5.作用参考文献 1.简介 mmap&#xff08;memory map&#xff09;即内存映射&#xff0c;用于将一个文件或设备映射到进程的地址空间。 实现这样的映射关系后&#xff0c;进程虚拟地址空间中一段内存地址将与文…

TorchScript C++ 自定义运算符 cpucuda

参考 在 C 中注册调度运算符 使用自定义 C 运算符扩展 TorchScript 环境&#xff1a; NVIDIA Driver Version : 545.23.08CUDA Version: 12.1Python Version: 3.11Pytorch Version: 2.1Cmake version : 3.18.1工作目录&#xff1a;workspace/test 一、 C 自定义运算符 创建…

逐字节讲解 Redis 持久化(RDB 和 AOF)的文件格式

前言 相信各位对 Redis 的这两种持久化机制都不陌生&#xff0c;简单来说&#xff0c;RDB 就是对数据的全量备份&#xff0c;AOF 则是增量备份&#xff0c;而从 4.0 版本开始引入了混合方式&#xff0c;以 7.2.3 版本为例&#xff0c;会生成三类文件&#xff1a;RDB、AOF 和记…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Java面试附答案:掌握关键技能,突破面试难题!

问题&#xff1a;什么是大O表示法&#xff1f;它在Java中的应用是什么&#xff1f; 回答&#xff1a; 大O表示法是一种用来衡量算法复杂度的方法&#xff0c;它描述了算法的时间复杂度和空间复杂度的增长速度。它使用符号O(n)来表示算法的渐进时间复杂度&#xff0c;其中n表示…

如何让Python2与Python3共存

安装 首先分别安装Py2和Py3&#xff0c;我都安装到C盘根目录里了&#xff0c;然后分别将Py2和Py3都配置到系统环境变量中去&#xff1a;C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts; 配置 修改两个版本的可执行文件名字 验证 重新配置一下pip …

Ubuntu删除应用图标

删除用户下的图标 sudo nautilus ~/.local/share/applications删除系统下的图标 sudo nautilus /usr/share/applications

大数据-之LibrA数据库系统告警处理(ALM-25500 KrbServer服务不可用)

告警解释 系统按30秒周期性检测组件KrbServer的服务状态。当检测到组件KrbServer服务异常时产生该告警。 当检测到组件KrbServer服务恢复时告警恢复。 告警属性 告警ID 告警级别 可自动清除 25500 致命 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务…

解决MySQL中某列数据过长无法入库的问题-Details:data too long for column `xxx` at row 1

问题描述&#xff1a; 我在将轨迹的经纬度转换为字符串入库时&#xff0c;遇到写入问题 Mysql数据入库报错&#xff1a; Caused by:java.long.exception:写入数据库表失败.Details:data too long for column xxx at row 1&#xff0c;我的xxx字段类型是string,在mysql库表中…

加速CI构建,实现高效流水线——CloudBees CI发布工作区缓存功能

加速软件交付流程能够更快接触到客户&#xff0c;获得竞争优势。然而&#xff0c;识别这一过程中存在的瓶颈可能颇具挑战。让我们从审查构建和测试阶段开始着手。例如&#xff0c;当CI作业执行时间较长时&#xff0c;它会延迟开发人员的反馈循环&#xff0c;从而可能导致发布延…

使用Python解析CAN总线

缘起 在新能源车辆的开发和维护中&#xff0c;经常需要对CAN总线数据进行分析。CANOE等总线软件虽然方便&#xff0c;但功能有限&#xff0c;难以满足数据分析的要求。Matlab的Vehicle Network Toolbox可以方便的进行数据解析和分析&#xff0c;它是闭源且收费的。因此&#x…

SpringBoot启动顺序

前言 每次有人问起SpringBoot的启动顺序是不是又来翻博客了&#xff1f;其实只需要稍微查看Spring的源码即可 步骤 SpringBoot的入口org.springframework.boot.SpringApplication#run(String... args), 这里面实现了SpringBoot程序启动的所有步骤 启动事件的顺序可以看监听器…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

C++ 问题 怎么在C++11标准语法中调用C++20的类

一. 问题 在工作中,因为一个算法功能需要跟别的部门对接,他们提供了该算法的头文件.h,静态库.lib,动态库.dll。但是头文件中使用了C++20才有的新特性,如#include等,而本地使用的vs2015开发环境,只支持C++11标准语法,这种情况下,该怎么把该算法集成到本地项目中呢? …