SpringSecurity之OAuth2
研究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 | http.oauth2ResourceServer().jwt() |
查看参考文章1给出的代码,唯一不同的就是依赖了,我把参考文章中的代码单独拿出来时可以运行的,但是等我把代码复制出来,迁移到另一个工程中的时候,就报了。唯一不同的就是依赖的问题了。
解决方式,这个主要是因为使用的版本问题,当我pom.xml中引入spring-boot-starter-parent:2.1.6.RELEASE时,就会出现这个问题。使用最新的版本2.3.2.RELEASE,就不会出现问题。但是会出现新的问题,如问题2
1.OAUTH2 spring Error creating bean with name ‘springSecurityFilterChain’
2.OAuth2 with spring-security failed to start
(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 | <parent> |
1.redisRateLimiter GatewayRedisAutoConfiguration required a single bean, but 2 were found: (这个issue中讲了如何进行相关的配置)
2.Spring GateWay OAuth2ResourceServer 配置ServerHttpSecurity中的hasRole 无效的问题
3.Spring Security 入门原理及实战 (这篇文章其实挺好的,就是从入门,一步步的往深入的分析)