(二)SpringCloud+Security+Oauth2 微服务初步集成

news2024/11/15 21:37:23

一 引言

本文主要好介绍了SpringCloud+Security+Oauth2 的初步集成,项目源码地址oauth2.0集成案例,以下案例主要是核心源码的解释,案例源码请查看案例源码

二 项目结构说明

在这里插入图片描述
oauth-server oauth认证中心
oauth-client oauth客户端
oauth-nacos 注册中心和配置中心
oauth-common 公用组件

三 认证中心的搭建

Oauth2提供了AuthorizationServerConfigurerAdapter适配器类来作为认证授权服务的配置,其中有三个方法源码如下:

public class AuthorizationServerConfigurerAdapter  {
    //客户端详情:配置客户端请求的参数
	public void configure(ClientDetailsServiceConfigurer clients)...	
	//授权服务断点:配置授权码和令牌的管理/存储方式
	public void configure(AuthorizationServerEndpointsConfigurer endpoints)...
    //授权服务安全配置:配置哪些路径放行(检查token的路径要放行)
	public void configure(AuthorizationServerSecurityConfigurer security) ...
}

配置详解:

  • ClientDetailsServiceConfigurer :用来配置客户端详情服务:如配置客户端id(client_id)资源id、客户端密钥(secrect)、授权方式、scope等,可以基于内存或jdbc。(可以理解为是对浏览器向授权服务器获取授权码或令牌时需要提交的参数配置),如果你做过三方登录应该就能理解这些参数,其实就是对客户端的参数配置,在客户端获取授权码或者获取Token的URL请求中就需要带上这些客户端参数
  • AuthorizationServerEndpointsConfigurer:配置令牌的访问端点url和令牌服务,如配置如何管理授权码(内存或jdbc),如何管理令牌(存储方式,有效时间等等)
  • AuthorizationServerSecurityConfigurer: 用来配置令牌端点的安全约束,如配置对获取授权码,检查token等某些路径进行放行

3.1 认证中心搭建

@Configuration
@EnableAuthorizationServer // 开启认证服务
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
    // 数据源
    @Autowired
    private DataSource dataSource;
    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private AuthenticationManager authenticationManager;
    // 客户端配置
    @Bean
    public ClientDetailsService customClientDetailsService(){
        return new JdbcClientDetailsService(dataSource);
    }




    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        /**
         * 必须将secret加密后存入数据库,否则报错:Encoded password does not look like BCrypt
         */
        clients.withClientDetails(customClientDetailsService());
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer
        		//对应/oauth/token_key 公开,获取公钥需要访问该端点
        		.tokenKeyAccess("permitAll()")
        		//对应/oauth/check_token ,路径需要授权,校验Token需要请求该端点
                .checkTokenAccess("isAuthenticated()")
                //允许客户端进行表单身份验证,使用表单认证申请令牌
                .allowFormAuthenticationForClients();
    }


    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore);
        endpoints.authenticationManager(authenticationManager);
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        tokenServices.setTokenStore(endpoints.getTokenStore());
        tokenServices.setSupportRefreshToken(true);
        tokenServices.setClientDetailsService(endpoints.getClientDetailsService());
        tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer());
        tokenServices.setAccessTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(30));
        endpoints.tokenServices(tokenServices);
    }
}

配置详解:
配置类上贴注解@EnableAuthorizationServer开启授权服务配置,继承AuthorizationServerConfigurerAdapter 实现配置的增强配置
客户端详情配置
JdbcClientDetailsService默认会去找数据库中的 名字为oauth_client_details 表中的数据作为客户端详情的配置,见 JdbcClientDetailsService类的源代码,所以我们需要在数据库执行以下sql创建表:并填充好数据

DROP TABLE IF EXISTS `oauth_client_details`;
CREATE TABLE `oauth_client_details` (
  `client_id` varchar(48) NOT NULL,
  `resource_ids` varchar(256) DEFAULT NULL,
  `client_secret` varchar(256) DEFAULT NULL,
  `scope` varchar(256) DEFAULT NULL,
  `authorized_grant_types` varchar(256) DEFAULT NULL,
  `web_server_redirect_uri` varchar(256) DEFAULT NULL,
  `authorities` varchar(256) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(4096) DEFAULT NULL,
  `autoapprove` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

授权服务配置
主要是通过AuthorizationServerEndpointsConfigurer 配置授权码和令牌相关的服务 ,在上面的配置类基础上增加配置内容

AuthenticationManager认证管理器“password”模式会用到认证管理器,它是在Security配置中定义的

TokenStore : token存储方式该接口常用的实现有:InMemoryTokenStore基于存储的token存储方案,JdbcTokenStore基于数据库的token存储方案,JwtToeknStore基于JWT的存储方案,RedisTokenStore基于Redis的存储方案,我上面的案例采用的是Redis的方式来实现

AuthorizationServerTokenServices 该接口用来配置授权服务器令牌,如配置是否支持Token,Token的存储方式(内 存,jdbc,),token加密,token过期等

令牌端点安全配置
AuthorizationServerSecurityConfigurer:用来配置令牌端点的安全策略

3.2 加载用户数据

在面的Security中我们已经介绍了UserDetailsService 在进行用户认证的时候回调用该接口获得用户信息,实现改接口,根据用户名校验当前用户是否存在

@Component
public class UserDetailServiceImpl implements UserDetailsService {

    @Autowired
    BCryptPasswordEncoder passwordEncoder;

    @Autowired
    private RemoteUserService remoteUserService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 查询数据库 获得相应的用户
        PtUser ptUser = remoteUserService.findOneByAccount(username);
        if (ptUser==null){
            throw new UsernameNotFoundException("用户名或密码错误");
        }
        // todo 查询相应的角色 这里不做演示
        return new User(ptUser.getAccount(),ptUser.getPassword(), AuthorityUtils.NO_AUTHORITIES);
    }
}

3.3 采用密码模式 获取token

http://localhost:9527/oauth/token?client_id=clientApp&client_secret=secretApp&grant_type=password&username=sys&password=123456

在这里插入图片描述

四 客户端搭建

4.1 客户端配置

通过@EnableResourceServer开启客户端配置,继承ResourceServerConfigurerAdapter开启对客户端的增强配置

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private ResourceServerTokenServices resourceServerTokenServices;

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.tokenStore(tokenStore);
        resources.tokenServices(resourceServerTokenServices);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/user/**").permitAll()// 放行用户相关的接口
                .anyRequest().authenticated();// 其他接口需要鉴权
    }
}

配置说明:
ResourceServerSecurityConfigurer 主要用于客户端关于oauth相关配置

  • ResourceServerTokenServices 用于客户端token的校验,当用户携带token请求资源时,资源服务器会向认证中心发送请求校验token的正确性,并把用户信息加载到安全上下文中
  • TokenStore 用于配置token的解析

HttpSecurity 主要是对SpringSecurity中的相关配置

4.2 yml配置token校验的相关配置

security:
  oauth2:
    client:
      client-id: clientApp # oauth 分发的client-id
      client-secret: secretApp # oauth 分发的client-secret
    resource:
      token-info-uri: http://localhost:9527/oauth/check_token # 认证中心token校验

4.3 测试

通过上面获得的token我们去访问资源服务器的相关资源
携带token请求成功
在这里插入图片描述
不携带token,请求失败
在这里插入图片描述
由此Spring Security+oauth2.0简单搭建由此集成了

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

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

相关文章

IDM究竟有哪些优势 IDM的几种超实用功能

作为一款体积只有10M的下载软件,IDM却常年霸占着各软件评测榜的前列。它的界面简洁清爽,使用过程中无弹窗、无广告,小小的体积竟能将下载速度提升5倍!该软件一进入中国市场,便受到了广大用户的追捧,被大家亲…

谁说Python只能用来敲代码,用Python来制作游戏你了解吗?

前言 Python的热度现在一直高居不下,比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。 那python还可以用来干什么?你知道哪些呢? (文末送读者…

HTML静态网页作业——基于html+css+javascript+jquery+bootstarp响应式成都家乡介绍网页

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

Python采集电商平台数据信息

环境介绍 python 3.8pycharm 2021专业版selenium >>> pip install selenium3.141.0 Python当中的模块 操作 浏览器的驱动Chrome浏览器Chromedriver 浏览器驱动 操作浏览器 让 浏览器帮助我们去执行一些操作 模块准备 from selenium import webdriver # 操作浏…

数钥科技遭用户投诉:“招集令”被指息费高,曾有助贷平台被处罚

融资难、融资贵,一直世界性难题。在此背后,是信息不对称的问题。 而利用信息不对称,不少助贷机构游走其中,也带来了一些新的问题,比如高额服务费、砍头息等,侵害消费者个人信息也是另外一个问题。此前&…

SQL——基础查询

查看列 查看特定列 select 姓名 from 学生表select 姓名,性别,家庭住址 from 学生表查看所有列 select * from 学生表使用计算列 求和 select sum(price) from fruit求个数 select count(price) from fruit求价格提升 select price*1.05 from fruit求库存数量 select (…

useState源码解读 及 手撕 useState 实现

文章目录useState源码解读 及 手撕 useState 实现useState源码分析逻辑图源码解读mountStatemountWorkInProgressHook 函数updateStateupdateReducer 函数实现对比图实现效果只声明一个 hook重复调用同一个 hook声明多个不同的 hooks体验收获useState源码解读 及 手撕 useState…

MySQL分区表对NULL值的处理

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:王权富贵 1.概述 MySQL的分区表没有禁止NULL值作为分区表达式的值,无论它是列值还是用户提供的表…

CPP 核心编程4-重载递增运算符

#include "iostream"using namespace std;//递增运算符重载 //自定义整型 class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger mi);public:MyInteger() {m_Num 0;}//重置前置运算符 返回引用是为了对同一个数进行操作MyInteger …

LSTM内部结构及前向传播原理——LSTM从零实现系列(1)

一、前言 作为专注于时间序列分析的玩家&#xff0c;虽然LSTM用了很久但一直没有写过一篇自己的LSTM原理详解&#xff0c;所以这次要写一个LSTM的从0到1的系列&#xff0c;从模型原理讲解到最后不借助三方框架自己手写代码来实现LSTM模型。本文本身没有特别独到之处&#xff0c…

Vue学习:el 与data的两种写法

el两种写法 法一&#xff1a;建立了联系 <!-- 准备容器 --><div id"root"><h1>hello,{{name}} </h1> <!-- {{插值语法}} --></div><script>new Vue({ el: #root,data: {name:Amy},});</script> 法二&#xff1a…

论文投稿指南——中国(中文EI)期刊推荐(第1期)

&#x1f680; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01;&#x1f384;&#x1f388; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xf…

java计算机毕业设计ssm特大城市地铁站卫生防疫系统5i80c(附源码、数据库)

java计算机毕业设计ssm特大城市地铁站卫生防疫系统5i80c&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持…

UDS服务基础篇之14

前言 你知道如果系统产生了DTC&#xff0c;应当如何清除呢&#xff1f;14服务具体的执行流程如何&#xff1f;14服务在使用过程中的常见bug又有哪些&#xff1f; 这篇&#xff0c;我们来一起探索并回答这些问题。为了便于大家理解&#xff0c;以下是本文的主题大纲&#xff1…

相控阵天线(十二):天线校准技术仿真介绍之旋转矢量法

目录简介旋转矢量法算法介绍旋转矢量法校准对方向图的影响旋转矢量法算法仿真移相器位数对旋转矢量法的影响多通道旋转矢量法算法仿真分区旋转矢量法算法仿真简介 由于制造公差和天线互耦的影响&#xff0c;天线各通道会呈现出较大的幅相误差&#xff0c;因此需对天线进行校准…

光阑,像差和成像光学仪器

人眼 人眼成像过程 空气-角膜 水状液-晶状体 晶状体-玻璃体 三个界面的折射成像 瞳孔 2-8mm 可变光阑,调节入射光强弱 睫状肌 改变晶状体曲率---调焦 人眼的调节 远点—眼睛完全松弛状态下看清楚的最远点&#xff0c;正常眼的远点在无穷远 近点—睫状肌最大收缩(焦…

【Redis】解决全局唯一 id 问题

永远要记得坚持的意义 一、全局唯一 id 场景 概念&#xff1a; 以订单表的 id 为例 使用自增 id 会产生的问题&#xff1a; id 的规律性太明显&#xff0c;容易让用户猜测到一些信息受表单数据量的限制 —— 分布式存储时&#xff0c;会产生问题 &#xff08;自增长&#x…

讲理论,重实战!阿里内部SpringBoot王者晋级之路全彩小册开源

大家都知道&#xff0c;Spring Boot框架目前不仅是微服务框架的最佳选择之一&#xff0c;还是现在企业招聘人才肯定会考察的点&#xff1b;很多公司甚至已经将SpringBoot作为了必备技能。但&#xff0c;现在面试这么卷的情况下&#xff0c;很多人面试时还只是背背面试题&#x…

基于KDtree的电路故障检测算法的MATLAB仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 k-d树是每个节点都为k维点的二叉树。所有非叶子节点可以视作用一个超平面把空间分割成两个半空间。节点左边的子树代表在超平面左边的点&#xff0c;节点右边的子树代表在超平面右边的点。选择超…

企业数据安全如何落实?私有化知识文档管理系统效率部署

编者按&#xff1a;本文分析了数据安全性企业的重要性&#xff0c;特别是高保密企业单位&#xff0c;介绍了天翎知识文档管理群晖NA是如何保护企业数据安全的。 关键词&#xff1a;私有化部署&#xff0c;安全技术&#xff0c;数据备份&#xff0c;病毒防护&#xff0c;全网隔…