第七章 SpringCloud OAuth2认证中心-搭建认证中心

基于springcloud-oauth2.0搭建认证中心与资源服务器 先学习上面文章 sprinboot整合springsecurity springsecurity动态数据查询 1、认证中心 1.1 依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=... 阅读详情
1.项目概要
这一章节的内容以第六章的代码为基础改造而成 https://github.com/kwang2003/springcloud-study-ch06.git 。
经过前几个章节的内容,我们的微服务项目架构逐渐完善了起来,这一章节的重点是通过给已有的微服务增加oauth2安全认证功能来保证服务调用的安全性,我们要实现的目标架构如下:

因为所有的外部请求都统一经过zuul网关,因此我们的Oauth2认证添加在Zuul这一层上,而每个微服务之间的调用则认为是项目内部模块之间的调用,不需要进行oauth2认证过程。
2.项目增加ouauth2模块
在我们的项目中增加一个新的模块springcloud-oauth2,并增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

修改下工程占用的端口号
server.port=8888
eureka.instance.hostname=oauth2
3.自定义登录页面和授权确认页面
创建 Oauth2Application 类,所谓项目的主函数所在类,继承自WebMvcConfigurerAdapter,自定义登录页面和授权页面的地址
package com.pachiraframework.springcloud.oauth2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableDiscoveryClient
@SpringBootApplication
public class Oauth2Application extends WebMvcConfigurerAdapter{
public static void main(String[] args) {
SpringApplication.run(Oauth2Application.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
registry.addViewController("/oauth/confirm_access").setViewName("authorize");
}
}
同时在src/main/resources下建立templates目录,增加2个ftl文件

authorize.ftl
<html>
<head>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.js"></script>
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h2>Please Confirm</h2>
<p>
Do you authorize "${authorizationRequest.clientId}" at "${authorizationRequest.redirectUri}" to access your
protected resources
with scope ${authorizationRequest.scope?join(", ")}.
</p>
<form id="confirmationForm" name="confirmationForm"
action="../oauth/authorize" method="post">
<#list authorizationRequest.scope as scop>
<input type="hidden" name="scope.${scop}" value="true"/>
</#list>
<input name="user_oauth_approval" value="true" type="hidden"/>
<input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button class="btn btn-primary" type="submit">Approve</button>
</form>
<form id="denyForm" name="confirmationForm"
action="../oauth/authorize" method="post">
<input name="user_oauth_approval" value="false" type="hidden"/>
<input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button class="btn btn-primary" type="submit">Deny</button>
</form>
</div>
</body>
</html>

login.ftl
<html>
<head>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<form role="form" action="login" method="post">
<div class="form-group">
<label for="username">Username:</label>
<input type="text" class="form-control" id="username" name="username"/>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" class="form-control" id="password" name="password"/>
</div>
<input type="hidden" id="csrf_token" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>
4.实现UserDetailsService
实际的项目中,我们的登录用户数据可能存在数据库中,也可能是存放在ladap或其他微服务接口中,springcloud oauth2给我们提供了一个UserDetailsService接口
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
在项目中,我们需要自行实现这个接口来获取用户信息。在这个例子中,我们在接口中写死了一个用户名admin,并为其手动指定了一个角色admin
package com.pachiraframework.springcloud.oauth2.service;

import java.util.Collection;
import java.util.HashSet;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
if ("admin".equalsIgnoreCase(name)) {
User user = mockUser();
return user;
}
return null;
}

private User mockUser() {
Collection<GrantedAuthority> authorities = new HashSet<>();
authorities.add(new SimpleGrantedAuthority("admin"));//用户所拥有的角色信息
User user = new User("admin","123456",authorities);
return user;
}
}
5.配置Oauth2Server和SecurityConfig
package com.pachiraframework.springcloud.oauth2.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
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 com.pachiraframework.springcloud.oauth2.service.MyUserDetailsService;

@Order(10)
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyUserDetailsService userDetailsFitService;//注意,这个MyUserDetailsService就是上个步骤中定义的bean
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().loginPage("/login").permitAll().and().authorizeRequests().antMatchers("/health", "/css/**")
.anonymous().and().authorizeRequests().anyRequest().authenticated();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsFitService);
auth.parentAuthenticationManager(authenticationManagerBean());
}
}

在这个例子中,我们把client的信息保存在内存中
package com.pachiraframework.springcloud.oauth2.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;

import com.pachiraframework.springcloud.oauth2.service.MyUserDetailsService;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private MyUserDetailsService userDetailsService;

@Override
public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory() // 使用in-memory存储
.withClient("client") // client_id
.secret("secret") // client_secret
.authorizedGrantTypes("authorization_code") // 该client允许的授权类型
.scopes("app"); // 允许的授权范围
}
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// @formatter:off
endpoints.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
// @formatter:on
}
}
6.访问oauth2服务
出现登录页面,输入用户名:admin 密码;123456

点击Submit按钮,进入用户授权确认页面

点击Approve,跳转到baidu页面,后面携带了code和state参数
根据code换取access_code,注意使用post方法
注意这个code要和上个步骤中获得的code保持一致

用户名输入client,密码是secret,点击确定

{
   "access_token": "38ef0fec-1b9f-4ee9-8c1a-95c03f6347a1",
   "token_type": "bearer",
   "expires_in": 42902,
   "scope": "app"
}
从0到1带大家搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (下)-代码重构篇 这样做有两个目的, 一 是不像让重构代码扰乱我们之前的开发流程 二是需要单独保留重构篇,让大家确确实实的参与到一个框架从无到有,从烦乱到精炼的过程 阅读详情

相关推荐

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1144

从零搭建SpringCloudAlibaba开发框架-001-认证中心

1. 在gitee上新建代码仓库,一开始建的会是私有的,建完之后再改成公开的。4.创建Module。

smilease的专栏 319

3GPP Release与UE Category:无线通信标准演进与终端能力分级全解析

在蜂窝移动通信领域,技术标准的演进与终端设备的能力分级是理解整个产业发展的核心框架。其基本原理由国际标准组织3GPP通过周期性发布的技术规范版本(Release)来定义,每个Release都像一份阶段性的技术蓝图,规定了网络与终端应支持的新功能与性能基线。这种标准化机制的技术价值在于确保了全球设备的互联互通与网络的平滑升级,为从4G LTE到5G NR乃至未来的演进提供了清晰路径。在这一框架下,终端能力分级(如LTE时代的UE Category)是将标准转化为具体设备性能的关键环节,它直接定义了终端在射频和

weixin_34098209的博客 329

SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口

点击关注公众号,实用技术文章及时了解本文主要内容是通过SpringCloud Gateway构建一个网关微服务,作为统一的认证授权和访问入口。配置文件先引入相关依赖,对应的pom文件内容如下:<?xmlversion="1.0"encoding="UTF-8"?> <projectxmlns="http://maven.apache.org/POM/4.0.0" ...

Java知音 840

UE5 Decal混合进阶:如何用DBuffer实现自定义Normal插值(附完整材质配置流程)

本文深入解析了UE5中利用DBuffer技术实现Decal自定义Normal插值的完整流程。通过详细的材质配置步骤和核心算法说明,帮助开发者突破传统混合模式限制,掌握高级法线控制技巧,特别适合需要精细环境细节的3A级项目开发。

table的专栏 224

SRAM compiler中 Number of banks 设置

的值时,需要考虑应用的性能需求、功耗要求和面积限制。设计者应根据具体的应用场景选择合适的bank数量,以优化整体系统性能。bank是一种用于分离存储器访问的设计结构,允许同时对不同的存储区域进行读写操作,从而提高存储器的并发访问性能。选项用于指定 SRAM 存储器的 并发存储区域。在 SRAM 编译器中,

hzmscut的博客 1871

SpringCloud整合OAuth2认证服务器搭建笔记

添加依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 认证服务器的配置说明2.1 配置客户端应用的详情信息(获取令牌、验令牌时使用) 2.2 配置authenticationManager,让认证服务器能识别登录的.

yichengjie_c的博客 487

搭建AutoSAR开发环境

任何开发都需要一套开发环境,包括软硬件环境,笔者后续将介绍的是 NXP 的 S32K144 配套的开发板。接下来详细介绍怎么获取这些软硬件工具。仅供个人学习使用!

cfl927096306的博客 6102

【java_wxid项目】【第七章】【Spring Cloud Security Oauth2集成】

Spring Cloud Security Oauth2集成

我是Java程序员廖志伟,感谢朋友们的支持! 1526

uniapp - 解决报错Error in event handler for “service.requestComponentInfo“: “TypeError: cannot read prop

uniapp,报错,Error in event handler for "service.requestComponentInfo": "TypeError: cannot read properties of undefined (reading 'matches')",h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,如何解决这个问题,一直报错,uniapp报错Error,都检查了还是报错,怎么解决这个错误,uniapp出现Error in event han

🏆 前端领域优质创作者 6379

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6141

第九章 SpringCloud Oauth2认证中心-Zuul网关上添加认证

本章完整源码地址:https://github.com/kwang2003/springcloud-study-ch09.git 1.项目概要 这一章节的内容以第七章的代码为基础改造而成https://github.com/kwang2003/springcloud-study-ch08.git。 通过第八章的学习,我们已经已经基于JWT升级了OAuth2认证服务器,在这个章节中

无证程序员 2万+

【推荐100个unity插件】在unity快速生成3D人物自然姿势和动作,且支持按图像生成姿势—— Pose AI

PoseAI是一款基于肌肉的智能动画创作工具,通过神经网络和逆运动学技术实现自然姿势生成。主要功能包括:自动/手动角色设置、神经控制装备、姿态估计与预览等。工具支持从2D图像生成3D姿势,并能在编辑器中实时预览动画效果。其神经网络架构采用前馈网络与ResNet结合的方式,通过多层全连接和ReLU激活函数处理输入数据。PoseAI简化了动画制作流程,提供高效的姿势创作解决方案,适用于Unity游戏开发。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1358

第八章 SpringCloud Oauth2认证中心-基于JWT认证

本章完整源码地址:https://github.com/kwang2003/springcloud-study-ch08.git 1.项目概要 这一章节的内容以第七章的代码为基础改造而成https://github.com/kwang2003/springcloud-study-ch07.git。 传统的web应用中,我们通常通过cookie+session机制来保证调用的安全,

无证程序员 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Day 5 登录页及路由 (三) 基于axios的API调用

作为前后端分离的系统,请求后端API是一个必不可少的工作,本文就介绍了Vue中调用后端API的基础内容。

来往 799

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

用ASP.NET实现简单的超市管理系统-登录页面

一、  任务描述 1.     使用Asp.NET技术,完成超市商品管理系统 2.     开发工具:VS2010 3.     数据库:SQL Server 2008 4.     功能模块:登录、账户管理、商品类别管理、商品信息管理   二、  数据库设计 表结构:(建完表,并插入测试数据) 商品分类表: 表名:CommoditySort 商品分类

qq_24800489的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Shiro中Session过期页面跳转回登录页面处理问题

Session超时的两种情况: shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时; 解决问题的思路:通过定义过滤器来检查是否Session过期问题,当前是否session超时,超时判定是否是ajax请求,如果是ajax请求,则在response头部设置session-status值,返回到前端读取

Tiger的专栏 2万+

[SpringBoot]Spring Security框架

在使用Spring Security框架时,可以自定义组件类,实现接口,则Spring Security就会基于此类的对象来处理认证!则在项目的根包下创建,在类上添加@Service注解使其成为组件类,实现@Slf4j@Service@Override(通过loadUserByUsername(String s)这个方法的名字可以理解为通过用户名加载用户,参数s就是username用户名,返回UserDetails用户详情)在项目中存在。

YJH000_的博客 1万+

微信小程序 + Java + Mysql(登录 Demo)

小程序 + Java + Mysql + Maven 实现登录 Demo 本案例应用到了 跨域过滤器、防止乱码的过滤器、还有对 jdbc的封装 三个工具类:DbUtil(连接数据库Mysql)、文件上传(图片)、MD5加密(对添加到数据库的密码进行加密,不再是明文显示)

zhiqiuqiu2的博客 5291

html+js+css实现登录页面

原生实现登录页面(主要用作移动端,pc端适配没做) 功能: ① 手机号正则校验 ② 登录点击事件 ③ 切换登录方式 ④ 验证码倒计时

long321041080的博客 2490

SpringBoot + Hutool 实现图片验证码登录

文章目录准备一个登录页面使用 Hutool 工具生成验证码LineCaptcha 线段干扰的验证码CircleCaptcha 圆圈干扰验证码ShearCaptcha 扭曲干扰验证码自定义验证码整合 SpringBoot结合验证码实现登录功能 使用 SpringBoot —— Hutool 实现图片验证码登录其实非常简单,下面就来实现一个简单的登录 demo 准备一个登录页面 这个登录页面的实现非常简单,因为本人不是很会前端,所以登录页面做得还是非常简陋的 编写该页面的时候需要用到 bootstrap 组件,

Woo_home的博客 1万+

三. 通过人事管理系统学习-----了解JSP的内置对象!!!(并且温习java基础的方法)

通过人事管理系统的练习了解九大内置对象的介绍 HTTP协议简介 协议是代表我们的客户端与服务器端交流的一种方式,http协议是一种超文本传输的协议方式。 HTTP请求:代表客户端在访问web资源的过程(请求) HTTP响应:服务端接受用户请求后,通过http协议,将资源响应给客户端 JSP内置对象简介 请求与响应模式:代表的是客户端与服务器端交互的一种模式, 在JSP中,请求与响应对象是通过内置对象存在的 JSP内置对象: 内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代

Slovenia_groot的博客 728

Spring boot整合SpringSecurity,完成登录的不同权限进入不同界面,实现简单的安全管理。(结合thymeleaf)

首先展示一下项目结构: 后端部分主要是两部分组成,一部分是config层,用来实现授权和认证;另一部分是controller层,用来写各个接口代码。 前端部分包括三个vip的页面,我们把它当做不同的权限对应的界面,加上一个主页index和一个登陆login界面。下面开始实作: 一、引入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring

m0_52625742的博客 3212

微服务认证系列二:SpringCloud OAuth2

在中已经完成了对认证服务的搭建,接下来,将搭建资源服务,来通过认证服务来对资源服务进行认证。

wanping15825992341的博客 1583

SpringCloud搭建微服务之OAuth2认证和授权

OAuth2.0是一个标准的授权协议,实际上它是用户资源和第三方应用之间的一个中间层,把资源和第三方应用隔开,使得第三方应用无法直接访问资源,第三方应用要访问资源需要通过提供凭证获得OAuth2.0授权,从而起到保护资源的作用

liu320yj的博客 4065
上一篇: 第六章 SpringCloud Zuul网关
下一篇: 第八章 SpringCloud Oauth2认证中心-基于JWT认证
CrazyCoder2010
博客等级 码龄16年 298粉丝 110原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值