范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

使用SpringSecurity资源服务器来保护SpringCloud微服务

  今天我将用实际例子来演示单体应用改造为Spring Cloud微服务时的资源服务器实现。  资源服务器改造
  以Spring Security实战干货的DEMO为例子,原本它是一个单体应用,认证和授权都在一个应用中使用。改造为独立的服务后,原本的认证就要剥离出去(这个后续再讲如何实现),服务将只保留基于用户凭证(JWT)的访问控制功能。接下来我们将一步步来实现该能力。  所需依赖
  在Spring Security的基础上,我们需要加入新的依赖来支持OAuth2 Resource Server和JWT。我们需要引入下面几个依赖库:                       org.springframework.boot             spring-boot-starter-security                                        org.springframework.security             spring-security-oauth2-resource-server                                       org.springframework.security             spring-security-oauth2-jose          ❝
  Spring Security 5.x 移除了OAuth2.0授权服务器,保留了OAuth2.0资源服务器。 JWT解码
  要校验JWT就必须实现对JWT的解码功能,在Spring Security OAuth2 Resource Server模块中,默认提供了解码器,这个解码器需要调用基于:  spring.security.oauth2.resourceserver
  配置下的元数据来生成解码配置,这里的配置大部分是调用授权服务器开放的 well-known 断点,包含了解析验证JWT一系列参数: jwkSetUri  一般是授权服务器提供的获取JWK配置的well-known 端点,用来校验JWT Token。 jwsAlgorithm  指定jwt使用的算法,默认 RSA-256 。 issuerUri  获取OAuth2.0 授权服务器元数据的端点。 publicKeyLocation  用于解码的公钥路径,作为资源服务器来说将只能持有公钥,不应该持有私钥。
  为了实现平滑过渡,默认的配置肯定不能用了,需要定制化一个JWT解码器。接下来我们一步步来实现它。  分离公私钥
  资源服务器只能保存公钥,所以需要从之前的 jks 文件中导出一个公钥。  keytool -export -alias felordcn -keystore   -file <导出cer的全路径>
  例如:   keytool -export -alias felordcn -keystore D:keystoresfelordcn.jks  -file d:keystorespublickey.cer
  把分离的 cer 公钥文件放到原来jks 文件的路径下面,资源服务器不再保存jks 。 自定义jwt解码器
  spring-security-oauth2-jose 是Spring Security的jose规范依赖。我将根据该类库来实现自定义的JWT解码器。     /**      * 基于Nimbus的jwt解码器,并增加了一些自定义校验策略      *      * @param validator the validator      * @return the jwt decoder      */     @SneakyThrows     @Bean     public JwtDecoder jwtDecoder(@Qualifier("delegatingTokenValidator") DelegatingOAuth2TokenValidator validator) {         CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");         // 从classpath路径读取cer公钥证书来配置解码器         ClassPathResource resource = new ClassPathResource(this.jwtProperties.getCertInfo().getPublicKeyLocation());         Certificate certificate = certificateFactory.generateCertificate(resource.getInputStream());         PublicKey publicKey = certificate.getPublicKey();         NimbusJwtDecoder nimbusJwtDecoder = NimbusJwtDecoder.withPublicKey((RSAPublicKey) publicKey).build();         nimbusJwtDecoder.setJwtValidator(validator);         return nimbusJwtDecoder;     }
  上面的解码器基于我们的公钥证书,同时我还自定义了一些校验策略。不得不说Nimbus的jwt类库比jjwt要好用的多。  自定义资源服务器配置
  接下来配置资源服务器。  核心流程和概念
  资源服务器其实也就是配置了一个过滤器 BearerTokenAuthenticationFilter 来拦截并验证Bearer Token。验证通过而且权限符合要求就放行,不通过就不放行。
  和之前不太一样的是验证成功后凭据不再是 UsernamePasswordAuthenticationToken 而是JwtAuthenticationToken : @Transient public class JwtAuthenticationToken extends AbstractOAuth2TokenAuthenticationToken {   private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;   private final String name;   /**   * Constructs a {@code JwtAuthenticationToken} using the provided parameters.   * @param jwt the JWT   */  public JwtAuthenticationToken(Jwt jwt) {   super(jwt);   this.name = jwt.getSubject();  }   /**   * Constructs a {@code JwtAuthenticationToken} using the provided parameters.   * @param jwt the JWT   * @param authorities the authorities assigned to the JWT   */  public JwtAuthenticationToken(Jwt jwt, Collection<? extends GrantedAuthority> authorities) {   super(jwt, authorities);   this.setAuthenticated(true);   this.name = jwt.getSubject();  }   /**   * Constructs a {@code JwtAuthenticationToken} using the provided parameters.   * @param jwt the JWT   * @param authorities the authorities assigned to the JWT   * @param name the principal name   */  public JwtAuthenticationToken(Jwt jwt, Collection<? extends GrantedAuthority> authorities, String name) {   super(jwt, authorities);   this.setAuthenticated(true);   this.name = name;  }   @Override  public Map getTokenAttributes() {   return this.getToken().getClaims();  }   /**   * jwt 中的sub 值  用户名比较合适   */  @Override  public String getName() {   return this.name;  }  }
  这个我们改造的时候要特别注意,尤其是从 SecurityContext 获取的时候用户凭证信息的时候。 资源管理器配置
  从Spring Security 5的某版本开始不需要再集成适配类了,只需要这样就能配置Spring Security,资源管理器也是这样:      @Bean     SecurityFilterChain jwtSecurityFilterChain(HttpSecurity http) throws Exception {         return http.authorizeRequests(request -> request.anyRequest()                         .access("@checker.check(authentication,request)"))                 .exceptionHandling()                 .accessDeniedHandler(new SimpleAccessDeniedHandler())                 .authenticationEntryPoint(new SimpleAuthenticationEntryPoint())                 .and()                 .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)                 .build();     }
  这里只需要声明使用JWT校验的资源服务器,同时配置好定义的 401 端点和403 处理器即可。这里我加了基于SpEL的动态权限控制,这个再以往都讲过了,这里不再赘述。 JWT个性化解析
  从JWT Token中解析数据并生成 JwtAuthenticationToken 的操作是由JwtAuthenticationConverter 来完成的。你可以定制这个转换器来实现一些个性化功能。比如默认情况下解析出来的权限都是带SCOPE_ 前缀的,而项目用ROLE_ ,你就可以通过这个类兼容一下老项目。      @Bean     JwtAuthenticationConverter jwtAuthenticationConverter() {         JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();         JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter(); //        如果不按照规范  解析权限集合Authorities 就需要自定义key //        jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("scopes"); //        OAuth2 默认前缀是 SCOPE_     Spring Security 是 ROLE_         jwtGrantedAuthoritiesConverter.setAuthorityPrefix("");         jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);         // 设置jwt中用户名的key  默认就是sub  你可以自定义         jwtAuthenticationConverter.setPrincipalClaimName(JwtClaimNames.SUB);         return jwtAuthenticationConverter;     }
  这里基本上就改造完成了。你受保护的资源API将由Bearer Token来保护。  ❝
  在实际生产中建议把资源服务器封装为依赖集成到需要保护资源的的服务中即可。 附加说明
  为了测试资源服务器,假设我们有一个颁发令牌的授权服务器。这里简单模拟了一个发令牌的方法用来获取Token:      /**      * 资源服务器不应该生成JWT 但是为了测试 假设这是个认证服务器      */     @SneakyThrows     @Test     public void imitateAuthServer() {          JwtEncoder jwsEncoder = new NimbusJwsEncoder(jwkSource());          JwtTokenGenerator jwtTokenGenerator = new JwtTokenGenerator(jwsEncoder);         OAuth2AccessTokenResponse oAuth2AccessTokenResponse = jwtTokenGenerator.tokenResponse();          System.out.println("oAuth2AccessTokenResponse = " + oAuth2AccessTokenResponse.getAccessToken().getTokenValue());     }              @SneakyThrows     private JWKSource jwkSource() {         ClassPathResource resource = new ClassPathResource("felordcn.jks");         KeyStore jks = KeyStore.getInstance("jks");         String pass = "123456";         char[] pem = pass.toCharArray();         jks.load(resource.getInputStream(), pem);          RSAKey rsaKey = RSAKey.load(jks, "felordcn", pem);          JWKSet jwkSet = new JWKSet(rsaKey);         return new ImmutableJWKSet<>(jwkSet);     }

苹果浏览器英文为什么叫Safari?Siri又是啥意思?有没有发现苹果iPad上面自带的浏览器叫Safari,Safari什么意思呢?我们知道浏览器的英文是browse,那为什么苹果浏览器不叫ibrowse呢?我们一起来看看吧据苹果互联群众对联想的攻击源自对他的期待过高联想最近被各种口诛笔伐,柳传志和杨元庆之流已经成为众矢之的。早前大家对联想的评价就是美帝良心想,说的就是联想产品美国售价比中国售价便宜很多,让公众感到愤怒。后来出现了华为5g投票门Python中的生成器列表生成式代码演示列表生成式list1x2forxinrange(10)x2处也可以放函数print(list1)0,1,4,9,16,25,36,49,64,81代码等价于lis大卖复盘黑五网一增长80独立站160流量转化都在增长今年的黑五网一已经画上了句号。各位卖家,你们公司内部做完复盘了吗?业绩增长情况如何,流量数据如何,转化率数据如何?圣诞节计划有什么调整?明年有什么计划呢?最近,宁波跨境电商大卖某哥苹果12和华为mate40pro推荐哪款?感谢您的阅读!其实,像这两款高端手机,我们已经不需要去纠结他们的影像能力,流畅性表现以及手机本身的性能特性。毕竟,这两款手机都是高端手机,它们的性能表现都是非常的凸显的,消费者对于如今发布接近半个月,还是需要抢购,再次开售还是很抢手预热了这么久的小米12今天终于要发布了,虽然说小米通过跟苹果对标,在手机市场上摆脱了摩托罗拉的碰瓷,但是其实在现在的手机市场上,还是有着很多的人在期待小米12会不会跟摩托罗拉正面对阿里供应链是什么?怎么加入?本文来自艾优原原未经允许禁止转载电商行业发展至今,许多朋友都会有或多或少的了解。但是关于阿里供应链有可能只是在听别人说或是自己偶然看见的项目。至于阿里供应链的服务费收益还是非常令人安全工信部通报阿里云,未及时上报重大漏洞,国资云建设刻不容缓中科院云计算中心分布式存储联合实验室特讯近期,工信部网络安全管理局通报,暂停阿里云公司作为工信部网络安全威胁信息共享平台合作单位6个月。此次事件源自阿里云发现阿帕奇(Apache)通过注解实现自定义SpringBootStarter自动装配以Springboot作为微服务开发的项目中会用到很多第三方,或者自建的一些依赖SDK,例如分布式锁文件管理数据库连接统一错误拦截等组件。为了达到通用的目的,都会创建自定义的spr马斯克的创新带动了我致富特斯拉(Tesla)电动汽車公司的首席执行官马斯克(CEO,ElonMusk)是继比尔盖茨(BillGates),斯蒂夫乔布斯(SteveJobs)之后,又成为当今时代的杰出偶象。薇娅的流量,去哪儿了?图片来源视觉中国文开菠萝财经(kaiboluocaijing),作者苏琦,编辑金玙璠只剩李佳琦能看了。这句话成为雪梨薇娅事件后,淘宝直播流量走向的真实写照。12月20日,薇娅全网账
你的iPhone上安装了哪些优秀的App?这11个iPhone上超级出色的良心APP,好几个iPhone自带的优秀软件,原来iPhone自带的软件竟然可以这么好用!以前真的是没发掘到!用完直呼相见恨晚!1微手帐(iOSAnc入门教程(十三)委托委托是一个方法的签名,它规定了方法的返回类型,参数的个数和类型。委托的作用是可以把方法当成参数一样进行传递。定义publicdelegatevoidToDo()委托由访问级别关键词电商之利弊电商优化了生产要素,提高了生产效率,相当于提高了生产力,比如原来全国的人民一年需1亿台电视机,从材料,到组装到分销渠道共需一百万工人,电视机一台一万。现在电商从分销渠道上少用五十万电脑一直嘟嘟嘟响是什么问题相信也有不少用户遇到过笔记本出现嘟嘟的声音的情况,出现这样的问题会对我们使用电脑造成一定的影响和困扰。那么我们应该如何解决出现嘟嘟声的问题呢?接下来就为大家来介绍一个小妙招,教教大英特尔订购全球最先进芯片制造机,为追赶台积电财经网科技1月19日讯,据新浪科技报道,为了从台积电手中夺回全球最先进芯片制造商的地位,英特尔今日向荷兰光刻机制造商阿斯麦(ASML)订购了一款最先进的芯片制造机(光刻机)。这款光邓丽君现场清唱甜蜜蜜!微软奈飞等巨头纷纷入局,又一风口来了?(央视财经经济信息联播)近来,元宇宙概念可谓是火爆网络。虚拟的世界个性化的人物和沉浸式的场景,都吸引了不少的关注。在元宇宙里可以有怎样的体验?生活方式会有哪些改变呢?记者走入元宇宙微软收购暴雪索尼股价暴跌市值一日蒸发200亿美元!丨一只热股微软宣布以687亿美元的价格收购游戏开发商动视暴雪后,市场出现了剧烈震动。微软在游戏界的主要竞争对手索尼尤其受挫。1月19日,索尼股价暴跌13,市值一天之内减少约200亿美元。微软Oracle不同数据库之间同步处理方案背景项目中遇到的问题,需要二区两台数据库之间同步一些表,以及导出sql文件同步至三区数据库。1SQL文件目录新建SQL文件生成的目录DmptmsudataDNLTBDIR。二区数据想换电动车,新日和雅迪哪个更好?选新日是必须的,好品质选新日,新日是电动车制造的黄浦军校,试问爱玛,雅迪等前十位电车制造商,哪家没有从新日高薪挖宝,亚运会,奥运会,世博会,指定用车是新日,还是上海主板上市公司,我全球最大比特币基金较比特币折价近30创出纪录Grayscale比特币信托基金成为了加密货币遭遇抛售的最大受害者之一。这个规模达到270亿美元的基金(代码GBTC)2022年迄今下跌了近27,大于比特币近9的跌幅。根据彭博的数中信证券新能源汽车换电行业销量五年有望提升十倍以上3060大背景下,换电成为推动新能源汽车全场景普及的必然形式,是充电的有效补充。我们预计,在政策资本自身产品力提升下,2022年有望成为换电行业高速发展的元年,全年有望新增换电站超