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(…)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值