springcloud微服务项目架构搭建第二天

springcloud微服务项目架构搭建第二天:整合oauth2时遇到的坑

推荐文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

springboot2.0 oauth2重要变更https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#security

1、在新版本中,如果要将Spring Security的AuthenticationManager公开为bean,需要重写WebSecurityConfigurerAdapter 上的authenticationManagerBean方法,并使用@Bean注释它。

2、在springboot2中,security配置有了重大的改变,有兴趣的可以阅读原文https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide#security,简单说一下就是Spring Boot 2大大简化了默认的安全配置,使添加自定义安全性变得简单。Spring Boot现在只有一个添加自己的行为后退,而不是有几个与安全相关的自动配置WebSecurityConfigurerAdapter。如果您使用以下任何属性,则会受到影响:

 

security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.sessions

 而且management.security.enabled配置被取消,被新的management.endpoints.web.exposure.include= '*'取代,通过配置各个端点来达到安全控制的目的,当然,也可以通过继承WebSecurityConfigurerAdapter并重写configure(HttpSecurity http)方法来配置RequestMatcher 属性达到目的

@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
                .anyRequest().hasRole("ENDPOINT_ADMIN")
                .and()
            .httpBasic();
    }

}

上面给出的是官方事例, 上面的示例用于EndpointRequest.toAnyEndpoint()将请求与任何端点进行匹配,然后确保所有端点都具有该ENDPOINT_ADMIN角色。其他几种匹配方法也可用EndpointRequest。有兴趣的可以阅读https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/actuator-api//html/

3、在Spring5.0中,WebMvcConfigurerAdapter已经弃用,

替代类:WebMvcConfigurationSupport或者DelegatingWebMvcConfiguration)
extends WebMvcConfigurerAdapter+@EnableWebMvc 等同于 extends WebMvcConfigurationSupport
切勿使用@EnableWebMvc和 extends WebMvcConfigurationSupport 在一起。

在继承WebMvcConfigurationSupport后发现自动配置的静态资源路径不生效,在查阅WebMvcAutoConfiguration源码后发现了一个神奇的事情

图中的@ConditionalOnMissingBean注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。

而上面说过spring5.0WebMvcConfigurerAdapter已经弃用,所以后两种方法:

1)、实现WebMvcConfigurer使用默认路径【classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/】(推荐,简单)

2)、继承WebMvcConfigurationSupport,并重写addResourceHandlers方法进行自定义路径

/**
 * 配置静态资源路径.
 *
 * @param registry registry.
 */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  WebMvcConfigurer.super.addResourceHandlers(registry);
}

4、重点来了,敲黑板 ,一个卡了好几天的神坑,关于security5.x中passwordEncode的改动

在5.x以前,security中的加密配置是酱紫的

@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder();
}

 这样配置的好处就是能快速的注入并bcrypt加密。

在5.x以后呢,在注入bean 的时候不能显式指定 PasswordEncoder 的实现类,类比旧方法。只能通过工厂类来创建

@Bean
public PasswordEncoder passwordEncoder() {
  return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

看一下源码

 通过工厂创建的bean默认也是使用bcypt格式,但是也可以通过自定义的方式创建自己加密类型,也就意味着同一张表里面可以存储不同加密格式的密码,那要怎么区分加密格式呢。。。。

{id}encodedPassword

id是用于查找PasswordEncoder应该使用的标识符,并且encodedPassword是所选的原始编码密码PasswordEncoder。在id必须在密码的开始,开始{和结束}。如果id找不到,id则为null。例如,以下可能是使用不同编码的密码列表id。所有原始密码都是“密码”。 以下例子来自官方文档:

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG (1)
{noop}password (2)
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc (3)
{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=  (4)
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0 (5)

第一个密码的PasswordEncoderid为bcrypt和encodedPassword

$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG。匹配时会委托给BCryptPasswordEncoder

第二个密码的PasswordEncoderid为noop和encodedPassword password。匹配时会委托给NoOpPasswordEncoder

第三个密码的PasswordEncoderid为pbkdf2和encodedPassword

5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc。匹配时会委托给Pbkdf2PasswordEncoder

第四个密码的PasswordEncoderid为scrypt和encodedPassword

$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc= 匹配时它将委托给SCryptPasswordEncoder

最后的密码的PasswordEncoderid为sha256和encodedPassword

97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0。匹配时会委托给StandardPasswordEncoder

附上原文地址:https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#migrating-to-spring-security-5

5、redis 2.2.x 版本中,当授权Auth-Server 配置token 保存在redis 时,报了下面的错误。

 原因:2.2.x版本中set(String,String)被弃用了,要使用RedisConnection.stringCommands().set(…)
  解决方法:
 1、不使用2.2.x 版本,升级到2.3.x
 2、重写tokenStore .因为最新版中RedisTokenStore的set已经被弃用了,
  所以我就只能自定义一个,代码和RedisTokenStore一样,
 只是把所有conn.set(…)都换成conn..stringCommands().set(…)

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正版课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】
搭建一个Spring Cloud微服务项目的步骤如下: 1. 在提供者服务中的pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> ``` 2. 在消费者服务中的pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> ``` 3. 在公共模块微服务中的pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> ``` 4. 修改microservice-consumer-config-client中的pom.xml文件,确保config的客户端有以下依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> ``` 5. 根据项目需要,进一步配置和开发相应的微服务模块,可以使用Eureka、Ribbon、Feign、Hystrix、Zuul、Config等技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值