springcloud的微服务的设计方案一:gateway+springsecurity+session共享

目录

架构方案

1、方案说明:

2、架构图:

3、项目结构:

4、请求流程和代码示例:

5、测试效果


架构方案

与网上大多数的基于gateway + springsecurity + token+ redis的方案不同。

这个方案是利用spring security的session共享机制,进行认证和鉴权。同时,这个方案也没有将springsecurity集成在springcloud gateway中,而是作为共通组件,集成在认证和业务类型的微服务中。

1、方案说明:

1)无论是认证微服务,还是其他业务类型的微服务,都是将springsecurity组件,作为每个微服务的依赖组件。

2)认证微服务,使用springsecurity进行认证处理

3)其他所有业务类型的微服务,使用springsecurity进行鉴权处理

4)利用spring security的session共享机制,处理前端调用以及微服务之间的session共享。

2、架构图:

  注:服务的注册与发现,使用nacos。服务之间的调用使用OpenFeign

3、项目结构:

1)module的依赖关系:

  • auth-->commons-->springsecurity
  • organization-->commons-springsecurity

pom.xml,yml文件,还是注解配置等详细配置方式可以参看我的另一篇文章:

springsecurity + session共享 + redis的用户登录,权限校验,_依然是那个墨镜的博客-CSDN博客

 2)微服务结构

  • WisdomsiteGateway是网关服务,在这个服务中,只做请求的转发,不做认证和鉴权。(这个与网上大多数方案不同)
  • Auth是认证服务,对于认真请求,进行认证的处理,并返回有效的session
  • Organization是一个业务服务。
    • 如果请求的业务服务没有认证,由业务服务的springsecurity组件,提示【未登录认证】的提示信息,提示发送认证请求。
    • 如果这个业务服务的请求信息携带有已经认真的session,则又spring security的组件,进行鉴权处理。

4、请求流程和代码示例:

代码示例:

organization微服务中,添加了权限表达式@PreAuthorize("hasAuthority('org:position:user:count')")的方法

@RestController
@RequestMapping("/sysmgr/position")
public class PositionController extends BaseController<Position, IPositionService> {

	@PreAuthorize("hasAuthority('org:position:user:count')")
	@GetMapping("/getUserCount")
	public FdApiResult getUserCountById(Long id){
		return userFeignService.getUserCountByPositionId(id);
	}
		
}

以上代码中userFeignService.getUserCountByPositionId,是一个OpenFeign的方法,这个方法调用了auth微服务的请求:/api/sysmgr/user/getUserCountByPositionId

@Component
@FeignClient(value = MicroServiceConstant.AUTH_SERVICE_NAME,  path= "/api/sysmgr/user",configuration = FeignConfig.class)
public interface IUserFeignService {

    @GetMapping("/getUserCountByPositionId")
    public FdApiResult getUserCountByPositionId(@RequestParam("id") Long id);
}

这个请求处理,我暂时定义在了auth微服务中,其实也可以在一个新的微服务中。

@RestController
@RequestMapping("/sysmgr/user")
@Slf4j
public class UserController extends BaseController<User, IUserService> {

	@PreAuthorize("hasAuthority('org:position:user:count')")
	@GetMapping("/getUserCountByPositionId")
	public FdApiResult getUserCountByPositionId(Long id){
		return FdApiResult.success(String.valueOf(5));
	}

}

此处只是为了说明,无论是在哪个微服务的处理请求中,只要加入了@PreAuthorize("hasAuthority('org:position:user:count')")权限声明,都会起到鉴权的效果。

因此,这里相当于进行了两次org:position:user:count的权限校验,第一次是在organization中,第二次是在openfeign请求到auth时,又进行了一次鉴权。

5、测试效果

1)测试登录:

2)测试业务请求

获取某一个岗位的用户数量:

  • 未登录认证的业务请求效果

  • 登录认证后,未授权的业务请求效果

  • 认证登录后,有权限的业务请求效果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SpringCloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的反应式API网关,它提供了一种简单而有效的方式来路由请求和过滤器请求,可以用于构建微服务架构中的网关层。 Spring Security是一个强大且灵活的身份验证和访问控制框架,可以集成到Spring应用程序中,用于保护应用程序的安全性。 JWT(JSON Web Token)是一种用于在网络应用间传递声明的一种基于JSON的开放标准。它可以通过数字签名来验证数据的完整性,并使用密钥对数据进行加密。 结合SpringCloud GatewaySpring Security和JWT可以实现一个安全的微服务架构。在这种架构中,SpringCloud Gateway作为网关层负责路由请求和进行安全过滤,Spring Security用于进行身份验证和访问控制,而JWT则用于传递和验证身份信息。 具体实现方案可以参考以下步骤: 1. 在SpringCloud Gateway中配置路由规则,将请求转发到相应的微服务。 2. 在Spring Security中配置身份验证和访问控制规则,例如用户名密码验证、角色授权等。 3. 在用户登录时生成JWT,在每个请求中将JWT作为Authorization头部发送给网关。 4. 网关收到请求后,解析JWT并验证其有效性和签名,如果验证通过,则将请求转发到相应的微服务。 5. 微服务在接收到请求后,可以通过解析JWT获取用户身份信息,并根据用户的权限进行相应的业务处理。 以上是一个简单的概述,具体的实现需要根据实际需求进行配置和开发。希望对你有所帮助!如果你还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值