1. 首页 > 快讯

Spring Cloud Alibaba 微服务实战:统一资源服务器配置

大家好,如果您还对Spring Cloud Alibaba 微服务实战:统一资源服务器配置不太了解,没有关系,今天就由本站为大家分享Spring Cloud Alibaba 微服务实战:统一资源服务器配置的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

废话不多说,我们直接开始代码改造吧。

认证服务器改造首先我们需要改造认证服务器。我们需要认证服务器在构建用户权限时使用权限标识字段。代码方面只需要在UserDetailServiceImpl#loadUserByUsername()中修改即可。

@OverridepublicUserDetailsloadUserByUsername(StringuserName) throwsUsernameNotFoundException{//获取本地用户SysUsersysUser=sysUserMapper.selectByUserName(userName);if(sysUser!=null){//获取当前用户的所有角色ListSysRoleroleList=sysRoleService.listRolesByUserId(sysUser.getId()) ; sysUser.setRoles(roleList.stream().map(SysRole:getRoleCode).collect(Collectors.toList()));ListIntegerroleIds=roleList.stream().map(SysRole:getId).collect(Collectors.toList());//获取所有角色的权限ListSysPermissionpermissionList=sysPermissionService.listPermissionsByRoles(roleIds);//基于方法的拦截。只需放入用户权限ID ListStringpermissionMethodList=permissionList.stream().map(SysPermission:getPermission).collect(Collectors.toList()); sysUser.setPermissions(permissionMethodList);//构建oauth2用户returnbuildUserDetails(sysUser);}else{thrownewUsernameNotFoundException('User['+userName+'] does not exit');}}网关改造网关服务器不再需要校准用户权限验证,所以我们需要删除所有相关的验证逻辑。

@ConfigurationpublicclassSecurityConfig{@BeanSecurityWebFilterChainwebFluxSecurityFilterChain(ServerHttpSecurityhttp)throwsException{http.httpBasic().disable().csrf().disable();returnhttp.build();}}独立资源服务器配置模块完成以上两步后,我们就到达了最重要的部分第1步,需要创建一个独立的资源服务器配置模块,以供其他模块参考。

首先我们要创建一个单独的资源服务模块cloud-component-security-starter。以下是修改后的代码结构图。

那么,为了让一个公共后端服务成为资源服务器,需要配置类继承ResourceServerConfigurerAdapter并进行相关配置。在我们独立的资源服务器模块中,首先要创建这样一个配置类。这个比较简单。只需从制作前一个模块的副本开始即可。

publicclassCloudResourceServerConfigureextendsResourceServerConfigurerAdapter{privateCustomAccessDeniedHandleraccessDeniedHandler;privateCustomAuthenticationEntryPointExceptionEntryPoint;privateTokenStoretokenStore;@Value('${security.oauth2.resource.id}')privateStringresourceId;@Autowired(required=false)publicvoidsetAccessDeniedHandler(CustomAccessDeniedHandleraccessDeniedHandler){this.accessDeniedHandler=accessDeniedHandler; }@Autowired(必需=false)publicvoidsetExceptionEntryPoint(CustomAuthenticationEntryPointExceptionEntryPoint){this.exceptionEntryPoint=exceptionEntryPoint;}@Autowired(required=false)publicvoidsetTokenStore(TokenStoretokenStore){this.tokenStore=tokenStore;}@Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests()。 requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll().antMatchers('/v2/api-docs/**','/swagger-resources/**','/swagger-ui.html','/webjars/**') .permitAll().anyRequest().authenticated().and().csrf().disable();}@Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources){DefaultAccessTokenConverteraccessTokenConverter=newDefaultAccessTokenConverter();UserAuthenticationConverteruserTokenConverter=newCustomUserAuthenticationConverter ();accessTokenConverter. setUserTokenConverter(userTokenConverter) ;if(exceptionEntryPoint!=null){resources.authenticationEntryPoint(exceptionEntryPoint);}if(accessDeniedHandler!=null){resources.accessDeniedHandler(accessDeniedHandler);}resources.resourceId(resourceId).tokenStore(tokenStore);} }现在有了Resource server配置,其他模块如何引入这个配置类呢?

这里我们可以利用SpringBoot的Enable模块驱动能力,通过@EnableXXX注解导入配置类。

我们创建一个自定义的注解类EnableCloudResourceServer,其他模块可以通过@EnableCloudResourceServer注解导入资源服务器配置。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@EnableResourceServer//启用资源服务器@Import({CloudResourceServerConfigure.class,TokenStoreConfigure.class})public@interfaceEnableCloudResourceServer{}最后我们知道微服务授权是基于方法拦截,基于方法拦截我们需要启用@EnableGlobalMethodSecurity,并迁移我们自定义的权限注解功能。所以我们再创建一个配置类来配置上述功能。

@EnableGlobalMethodSecurity(prePostEnabled=true)publicclassCloudSecurityAutoConfigureextendsGlobalMethodSecurityConfiguration{@Bean@ConditionalOnMissingBean(name='accessDeniedHandler')publicCustomAccessDeniedHandleraccessDeniedHandler(){returnnewCustomAccessDeniedHandler();}@Bean@ConditionalOnMissingBean(name='au thenticationEntryPoint')publicCustomAuthenticationEntryPointauthenticationEntryPoint( ){returnnewCustomAuthenticationEntryPoint();} @OverrideprotectedMethodSecurityExpressionHandlercreateExpressionHandler(){returnnewCustomMethodSecurityExpressionHandler();}}经过上述改造,独立的资源服务器已经成功创建,现在剩下的就是改造微服务了。

微服务转型

删除maven中原有的oauth2.0相关配置,引入自定义的cloud-component-security-starter

dependencygroupIdcom.jianzh5.cloud/groupIdartifactIdcloud-component-security-starter/artifactId/dependency 删除所有资源服务器相关代码(此过程略)

修改主启动类,通过@EnableCloudResourceServer引入资源服务器配置

@EnableDiscoveryClient@SpringCloudApplication@EnableCloudResourceServerpublicclassAccountServiceApplication{publicstaticvoidmain(String[]args){SpringApplication.run(AccountServiceApplication.class,args);}}在需要的Controller方法中添加自定义权限拦截注解@PreAuthorize('hasPrivilege('queryAccount')被拦截)))')

当然,也可以使用SpringSecurity原生注解@PreAuthorize('hasAuthority('queryAccount')'),也有同样的效果。

@GetMapping('/account/getByCode/{accountCode}')@PreAuthorize('hasPrivilege('queryAccount')')//@PreAuthorize('hasAuthority('queryAccount')')publicResultDataAccountDTOgetByCode(@PathVariable(value='accountCode') )StringaccountCode){AccountDTOaccountDTO=accountService.selectByCode(accountCode);returnResultData.success(accountDTO);}测试当我们访问未经权限的方法时,会出现如下错误信息,说明独立资源服务器配置成功。

{'status':500,'message':'不允许访问','data':null,'success':false,'timestamp':1619052359563} 提示:@PreAuthorize 注解的异常会抛出AccessDeniedException,不会被accessDeniedHandler 捕获。相反,它将被全局异常捕获。

如果需要自定义@PreAuthorize错误异常,可以通过全局@RestControllerAdvice拦截异常

拦截后的自定义异常如下:

{'status':2003,'message':'没有权限访问此资源','data':null,'success':false,'timestamp':1619052359563} 以上,希望对您有所帮助!

用户评论

眷恋

感觉学习micro service一直都是很让人excited的呀!希望这篇文章能让我顺利理解配置模块

    有12位网友表示赞同!

情字何解ヘ

看了下Spring Cloud Alibaba的文档,确实挺全面,期待文章能够深入讲解。

    有7位网友表示赞同!

尘埃落定

51CTO的文章质量还是可以的,经常分享一些比较实用的教程。

    有18位网友表示赞同!

龙吟凤

我之前也尝试过搭建微服务架构,配置模块总是让我头疼,这篇文章应该能给我解答疑惑。

    有14位网友表示赞同!

凉城°

对于入门者来说,SpringCloud Alibaba的实战案例非常重要,希望能有详细步骤讲解。

    有20位网友表示赞同!

我没有爱人i

期待文章能给出一些常见的配置问题以及解决方案,很有参考价值。

    有5位网友表示赞同!

一笑抵千言

最近对微服务架构有一些了解,想深入学习Spring Cloud Alibaba的应用场景。

    有8位网友表示赞同!

。婞褔vīp

我已经掌握了基础的SpringCloud知识,希望能从这篇文章中学会如何配置其资源服务器模块。

    有20位网友表示赞同!

我的黑色迷你裙

文章介绍的主题很吸引人,特别是“实战”两个字,希望能够看到实际案例分析。

    有16位网友表示赞同!

全网暗恋者

学习一篇高质量的文章总是让人觉得心情愉快,希望这篇文章能让我有所收获。

    有6位网友表示赞同!

微信名字

想了解如何在Spring Cloud Alibaba中利用统一资源服务器进行身份认证和授权验证。

    有5位网友表示赞同!

念初

微服务的配置模块非常重要,这篇文章应该会讲解比较深刻的知识点。

    有6位网友表示赞同!

执妄

对想要学习SpringCloud Alibaba项目的同学来说,理解资源服务器配置模块至关重要!

    有6位网友表示赞同!

红尘烟雨

相信在这篇文章中会有许多实用的技巧和经验分享,值得一看。

    有11位网友表示赞同!

权诈

我对微服务框架非常感兴趣,这篇文章能让我了解Spring Cloud Alibaba中的一个关键模块。

    有20位网友表示赞同!

醉红颜

学习新技术总是充满挑战,希望这篇文章能给我一些启发!

    有10位网友表示赞同!

残留の笑颜

期待文章能给出具体的配置步骤和示例代码,方便理解和实践。

    有12位网友表示赞同!

爱你的小笨蛋

我已经有了一些微服务开发经验,想进一步了解Spring Cloud Alibaba的优势和特点。

    有19位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/6812.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666