SpringSecurity之OAuth2

标签: Springboot 分类: Java 创建时间:2020-08-04 02:08:03 更新时间:2024-11-27 11:14:45

研究SpringSecurity也已经有好几天了,暂时还是一头雾水,可能只有等代码写的多了才能理解其精华,总是查看各种文章,不去动手的话,还是有些不合适的。

参考文章:
1.微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权! (这篇文章已经非常符合我的要求了,包括了JWT认证,包括了gateway添加security,包括了其他的一些知识点,还给了一个micro-oauth2-auth的例子,实现了基于密码模式的oauth2认证)
2.从零开始的Spring Security Oauth2(二) (这个深入到了源码层面,对oauth2进行了深入的讲解,是程序员DD写的,还是比较浅显易懂的。)
3.从零开始的Spring Security Oauth2(一) (这里在讲如何使用security进行oauth2开发的例子)
4.Spring-Boot2.0 + Spring Security + Oauth2 (这篇文章也挺好的,虽然讲了四种授权类型的区别,但是结合时序图,我竟然感觉都是一样的。)

实现TokenEnhancer

在实现oauth2的时候,还可以使用自定义实现的TokenEnhancer,进行返回的jwt信息增强。

UserDetails

UserDetailsService接口只提供了一个loadUserByUsername方法,这个方法返回的是一个UserDetails,我们可以实现这个UserDetails接口,提供自己的用户信息。实现用户查询的逻辑是这样的
(1) 实现UserDetails,可以在标准属性之外,添加自己的属性
(2) 实现UserDetailsService,返回一个UserDetails
(3) 在securityconfig中配置使用UserDetailsServer,这里就有不同的方式了,可以通过http.userDetailsService(securityUserDetailsService)指定。

问题

(1) java.lang.NoSuchMethodError: ‘void org.springframework.security.oauth2.server.resource.authentication.ReactiveJwtAuthenticationConverterAdapter
根据参考文章编写oauth2的spring gateway的授权时,只要是添加了下面的代码,就会报上面的错误:

1
2
http.oauth2ResourceServer().jwt()
.jwtAuthenticationConverter(jwtAuthenticationConverter());

查看参考文章1给出的代码,唯一不同的就是依赖了,我把参考文章中的代码单独拿出来时可以运行的,但是等我把代码复制出来,迁移到另一个工程中的时候,就报了。唯一不同的就是依赖的问题了。

解决方式,这个主要是因为使用的版本问题,当我pom.xml中引入spring-boot-starter-parent:2.1.6.RELEASE时,就会出现这个问题。使用最新的版本2.3.2.RELEASE,就不会出现问题。但是会出现新的问题,如问题2

(2) redisRateLimiter in org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration required a single bean, but 2 were found:

这个问题是因为spring gateway和spring boot不兼容引起的。使用2.2以上的springboot,就要使用hoxton rc1而不能使用Greenwich.SR1版本。

Greenwich is not compatible with boot 2.2. please downgrade boot to 2.1 or use hoxton rc1

最后的配置版本为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/>
</parent>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!--这个版本是不兼容的,或者使用Hoxton更高版本-->
<!--<version>Greenwich.SR1</version>-->
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
<dependencyManagement>
参考文章:
1.redisRateLimiter GatewayRedisAutoConfiguration required a single bean, but 2 were found: (这个issue中讲了如何进行相关的配置)
2.Spring GateWay OAuth2ResourceServer 配置ServerHttpSecurity中的hasRole 无效的问题
3.Spring Security 入门原理及实战 (这篇文章其实挺好的,就是从入门,一步步的往深入的分析)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。