Spring Security OAuth2.0(二)-----简化模式/密码模式/客户端模式/刷新 token

news2025/1/13 3:15:50

简化模式

在这里插入图片描述
在这里插入图片描述

代码示例

修改authorization_server授权服务模块

新增“implicit” 和修改回调地址为本次地址
在这里插入图片描述

修改第三方应用项目搭建新页面模拟

新建implicit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}"></c:set>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<script type="application/javascript" src="${path}/jquery1.9.1.min.js"></script>
<script type="application/javascript" src="${path}/jquery.min.js"></script>
<body>
你好,第三方测试!

<a href="http://localhost:53020/uaa-service/oauth/authorize?client_id=xql&response_type=token&scope=all&redirect_uri=http://localhost:8089/goods/implicit.jsp">第三方登录(简化模式)</a>

<div id="div1"></div>
<script>
    var hash = window.location.hash;//提取出参数,类似这种格式#access_token=9fda1800-3b57-4d32-ad01-05ff700d44cc&token_type=bearer&expires_in=7199
    if (hash && hash.length > 0) {
        var params = hash.substring(1).split("&");
        var token = params[0].split("=");//[access_token,9fda1800-3b57-4d32-ad01-05ff700d44cc]
        $.ajax({
            type: 'get',
            headers: {
                'Authorization': 'Bearer ' + token[1]
            },
            changeOrigin: true, // 设置成true:发送请求头中host会设置成target
            url: 'http://localhost:53021/resource-service/admin/hello',
            success: function (data) {
                $("#div1").html(data)
            }
        })
    }
</script>
</body>
http://localhost:53020/uaa-service/oauth/authorize?client_id=xql&response_type=token&scope=all&redirect_uri=http://localhost:8089/goods/implicit.jsp
还是之前的超链接不变,但是我们将 response_type 的值修改为 token,表示直接返回授权码
redirect_uri修改为当前页面地址

这样,当用户登录成功之后,会自动重定向到http://localhost:8089/goods/implicit.jsp 页面,并且添加了一个锚点参数,类似下面这样:

http://localhost:8089/goods/implicit.jsp#access_token=9fda1800-3b57-4d32-ad01-05ff700d44cc&token_type=bearer&expires_in=1940

所以接下来,我们就在 js 中提取出 # 后面的参数,并进一步解析出 access_token 的值。

拿着 access_token 的值,我们去发送一个 Ajax 请求,将 access_token 放在请求头中,请求成功后,将请求到的数据放在 div 中。

这就是我们说的简化模式。

测试

配置完成后,启动三个项目
访问http://localhost:8089/goods/implicit.jsp 页面进行测试,
用户授权之后,会自动重定向到该页面
点击第三方登录简化模式
在这里插入图片描述
跳转到登录
在这里插入图片描述
点击允许授权
在这里插入图片描述
发现url携带了token和打印了admin资源接口返回值
在这里插入图片描述

密码模式

在这里插入图片描述
在这里插入图片描述
密码模式,需要用户直接在第三方应用上输入用户名密码登录

代码示例

修改authorization_server授权服务模块

修改支持“password”
配置redirectUris地址
在这里插入图片描述
由于使用了 password 模式之后,用户要进行登录,所以我们需要配置一个 AuthenticationManager,还是在 AuthorizationServer 类中,具体配置如下:
注意,在授权码模式中,我们配置的 AuthorizationCodeServices 现在不需要了,取而代之的是 authenticationManager。
在这里插入图片描述

    @Autowired
    AuthenticationManager authenticationManager;

SecurityConfig 中添加下面代码
在这里插入图片描述

package com.xql.authorization_server.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("lyp")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("admin")
                .and()
                .withUser("xql")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("user");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().formLogin();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

修改第三方应用项目搭建新页面模拟

新增登录页面login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}"></c:set>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>

<body>
你好,第三方测试!

<form action="${path}/login" method="post">
    <table>
        <tr>
            <td>用户名:</td>
            <td><input name="username"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input name="password"></td>
        </tr>
        <tr>
            <td><input type="submit" value="登录"></td>
        </tr>
    </table>
</form>
<h1>${msg}</h1>
</body>

我们来看登录接口:

    @PostMapping("/login")
    public String login(String username, String password,Model model) {
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("username", username);
        map.add("password", password);
        map.add("client_secret", "xql123");
        map.add("client_id", "xql");
        map.add("grant_type", "password");
        Map<String,String> resp = restTemplate.postForObject("http://localhost:53020/uaa-service/oauth/token", map, Map.class);
        String access_token = resp.get("access_token");
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Bearer " + access_token);
        HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
        ResponseEntity<String> entity = restTemplate.exchange("http://localhost:53021/resource-service/admin/hello", HttpMethod.GET, httpEntity, String.class);
        model.addAttribute("msg", entity.getBody());
        return "login";
    }

在点击登录之后
在登录接口中,当收到一个用户名密码之后,我们通过 RestTemplate 发送一个 POST 请求,注意 post 请求中,grant_type 参数的值为 password,通过这个请求,我们可以获取 auth-server 返回的 access_token,格式如下:

{access_token=02e3a1e1-925f-4d2c-baac-42d76703cae4, token_type=bearer, refresh_token=836d4b75-fe53-4e41-9df1-2aad6dd80a5d, expires_in=7199, scope=all}

我们提取出 access_token 之后,接下来去请求资源服务器,并将访问到的数据放在 model 中。

测试

访问登录页面http://localhost:8089/goods/login.jsp
在这里插入图片描述
输入账号密码 请求了后台接口 接口携带当前输入的账号密码以及grant_type=password请求了/oauth/token获取access_token 获取到token又访问了资源服务器

在这里插入图片描述
最好把资源服务器结果admin展示到页面
在这里插入图片描述

客户端模式

在这里插入图片描述
客户端模式适用于没有前端页面的应用
在这里插入图片描述

代码示例

修改authorization_server授权服务模块

修改允许“client_credentials”
在这里插入图片描述

修改第三方应用项目搭建新接口测试

    @GetMapping("/test")
    public void test(){
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("client_id", "xql");
        map.add("client_secret", "xql123");
        map.add("grant_type", "client_credentials");
        Map<String,String> resp = restTemplate.postForObject("http://localhost:53020/uaa-service/oauth/token", map, Map.class);
        String access_token = resp.get("access_token");
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Bearer " + access_token);
        HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
        ResponseEntity<String> entity = restTemplate.exchange("http://localhost:53021/resource-service/hello", HttpMethod.GET, httpEntity, String.class);
        System.out.println(entity.getBody());
    }

值得一提的是 我们这里访问的hello 不需要身份这个
在这里插入图片描述

测试

打开浏览器访问接口http://localhost:8089/goods/test
控制台打印资源返回信息
在这里插入图片描述

大家公有的一个属性(刷新 token)

是四种授权模式共有的功能。

以授权码模式为例,当我们启动 auth-server 之后,在 IntelliJ IDEA 中,我们可以看到项目暴露出来的接口:
在这里插入图片描述
那么这些接口都是干嘛用的呢?
在这里插入图片描述
/oauth/token 端点除了颁发令牌,还可以用来刷新令牌,在我们获取令牌的时候,除了 access_token 之外,还有一个 refresh_token,这个 refresh_token 就是用来刷新令牌用的。
我用 postman 来做一个简单的刷新令牌请求:
http://localhost:53020/uaa-service/oauth/token?client_id=xql&client_secret=xql123&refresh_token=ba1f307c-8f9c-4173-bfcc-299854c457e9&grant_type=refresh_token
在这里插入图片描述

注意,刷新的时候需要携带上 refresh_token 参数,刷新完成之后,之前旧的 access_token 就会失效。

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

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

相关文章

C++入门篇(二)

目录 一、引用1.1 什么是引用&#xff1f;1.2 引用的特性1.3 常引用1.4 引用的使用场景1.5 传值和传引用效率比较1.5.1 传值和传引用做参数的性能对比1.5.2 传值和传引用做返回值的性能对比 1.6 引用和指针之间的区别 二、内联函数2.1 什么是内联函数&#xff1f;2.2 内联函数的…

知识变现海哥|研究了100个项目,这个才是人生逆袭首选

&#xff08;本文源自公号跟海哥学知识变现&#xff0c;移步公号与100万知识变现/知识付费创业者&#xff0c;一起学知识变现知识付费干货&#xff0c;回‘领书’获取3本电子书&#xff1a;【知识付费秘籍】【知识创业者成长手册】【100个知识付费成功案例】) 经常有人问海哥&a…

什么是中断向量表?作用是什么?为什么需要偏移?

一、定义与特点 定义&#xff1a;中断向量表(interrupt vector table)包含中断服务程序地址的特定内存区域&#xff0c;这些服务程序是处理外部硬件中断请求的代码。 特点&#xff1a;这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的&#xff0c;当某个中断…

ESP32-C2开发板 Homekit烧录教程

准备 1.1硬件ESP32 C2开发板&#xff0c;如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载&#xff0c;也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…

以智求治,MapGIS打造公共安全治理新模式

随着我国城市人口和规模日益扩大&#xff0c;城市运行系统日趋复杂&#xff0c;各类风险隐患增多且呈现相互叠加、相互耦合态势&#xff0c;各类风险、事故灾害类事件造成的损失严重&#xff0c;公共安全防范压力不断增大。 党的二十大报告中指出&#xff1a;“建立大安全大应…

【容器化应用程序设计和开发】2.1 容器化基础知识和Docker容器

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 容器化应用程序设计和开发 2.1 容器化基础知识和Docker容器2.1.1 容器的创建2.1.2 容器的管理 容器化应用程序设计和开发是一种基于容器技术的应用程序设计和开发方法论。它将应用程序拆分为多个小型服务&#x…

Centos7安装MySQL-5.7.17详细教程

1、MySQL安装包可以在Oracle官网下载 下载链接:https://dev.mysql.com/downloads/mysql/5.7.html 也可以通过wget命令下载 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 下载完成之后解压tar包 命令&#xff1a;tar -zxvf…

Smith预估控制器

Smith预估器主要针对存在大滞后的系统,作用延迟和反馈延迟环节的控制,Smith预估器的另一篇文章,请参看下面的博客文章: 博途1200/1500PLC Smith预估器(补偿器)算法实现(FB)_RXXW_Dor的博客-CSDN博客在写这篇文章之前写过一篇"大林控制算法",大家可以参看下面这…

一款适合智慧档案馆一体化建设平台的多参数空气质量传感器

智慧档案馆一体化建设平台配件产品/空气质量传感器/空气质量云测仪/空气质量检测仪/空气质量探测器/环境集成传感器 主要检测参数&#xff1a;温度、湿度、粉尘PM2.5/PM10、二氧化碳CO2、甲醛、TVOC等六参数档案库房常用环境参数检测。 安装方式&#xff1a;吸顶式 信号输出&…

Element table组件动态设置expand展开项以及同时只展开一项

场景一&#xff1a;table表格展开项过多&#xff0c;界面数据太繁杂影响查看。 场景二&#xff1a;Element Table加载的数据发生变化时&#xff0c;会重新渲染界面&#xff0c;之前的展开项会自动关闭&#xff0c;用户需要手动去打开展开项&#xff0c;频繁的手动操作会极大的影…

Vue系列:在离线环境下部署,CDN无法访问导致vuex.min.js、axios.min.js和vue-router.min.js的cdn地址无法访问

目录 遇到的问题&#xff1a; 问题分析&#xff1a; 解决方案有以下两种&#xff1a; 遇到的问题&#xff1a; 在客户现场部署程序&#xff0c;是在外网环境的服务器上&#xff0c;部署起来后&#xff0c;发现前端vuex.min.js、axios.min.js和vue-router.min.js无法访问 问题…

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件&#xff0c;设置优先级并开启 2、基于Scrapy框…

Node【初识Express框架】

文章目录 &#x1f31f;前言&#x1f31f;Express框架&#x1f31f;1.什么是框架&#x1f31f;2.express安装&#x1f31f;3.创建web服务基本遵循之前的四个步骤&#xff1a; &#x1f31f;4.路由&#x1f31f; 由 &#xff1a;请求方式请求路径&#xff08;1&#xff09;get发…

从传统管理到智慧水务:数字化转型的挑战与机遇

概念 智慧水务是指利用互联网、物联网、大数据、人工智能等技术手段&#xff0c;将智能化、信息化、互联网等技术与水务领域相结合&#xff0c;通过感知、传输、处理水质、水量、水价等数据信息&#xff0c;对水资源进行全面监测、综合管理、智能调度和优化配置的智能化水务系…

电商平台商品数据爬虫分析(test阶段可对接测试)

1.简单说明 京东&#xff0c;淘宝&#xff0c;天猫&#xff0c;&#xff0c;淘特&#xff0c;拼多多&#xff0c;阿里巴巴&#xff0c;1688&#xff0c;抖音&#xff0c;苏宁&#xff0c;亚马逊中国 &#xff0c;lazada&#xff0c;速卖通等全球50多个知名平台抓取数据&#x…

蓝牙耳机哪个品牌音质好?300到400的蓝牙耳机推荐

不知道从什么时候开始&#xff0c;越来越喜欢安静和独处&#xff0c;去外面闲逛也总是佩戴上蓝牙耳机&#xff0c;享受音乐带来的美妙&#xff01;蓝牙耳机便利性也让很多小伙伴开始选择&#xff0c;出门在外&#xff0c;背包里面永远装着蓝牙耳机&#xff0c;以备不时之需&…

CANoe使用记录(二):Trace界面介绍

目录 1、概述 2、Trace界面介绍 2.1、右键配置 2.2、显示Title信息 2.3、改变窗口颜色 2.4、详细视图 2.5、静态视图 2.6、差异窗口 2.7、预过滤器 2.8、过滤分析 3.9、保存报文 3.10、其他类型简述 1、概述 Trace界面用于监控报文的界面&#xff0c;此界面包含很…

缓存优化---环境搭建

缓存优化 为什么要使用redis缓存&#xff1f; 问题说明 用户数量多&#xff0c;系统访问大&#xff0c;频繁访问数据库&#xff0c;系统性能下降&#xff0c;用户体验差 环境搭建 maven坐标 在项目中的pom.xml文件中导入spring data redis的maven坐标&#xff1a; <depen…

数学建模第四天:数学建模算法篇之整数规划、指派问题及其求解方法

目录 一、前言 二、整数规划模型 1、整数规划特征 2、分枝定界法 ①分枝定界法的步骤 ②实际解题 三、0-1整数规划 1、隐枚举法 ①隐枚举法的步骤&#xff1a; ②案例 2、匈牙利法 ①指派问题 ②匈牙利法步骤 ③案例 一、前言 我们先来看一个例子&#x…

【Linux】Linux中的常用指令和将java程序运行环境部署到Linux

目录 一.Linux的常用指令 使用客户端进行登录与退出 我们使用xshell这个客户端进行用户的创建和登录 退出&#xff1a; 快捷键 IS PWD cd touch echo cat mkdir tree rm mv cp find man less vim date ps grep netstat 二.Linux的权限问题 用户操作 …