在微服务项目中使用 Shiro 进行全局拦截时,可以采用以下几种服务架构设计思路:
网关层拦截:
- 通过在 API 网关层配置 Shiro 过滤器,对所有进入微服务系统的请求进行统一的权限验证和访问控制。
- 网关层可以充当一个统一的鉴权中心,负责认证用户身份、验证权限,并将合法请求转发给相应的微服务。
在GlobFilter中实现Shiro: Shiro 的 Glob Filter 是一种灵活的 url 匹配方式,可以用于匹配多种请求路径,通过配置不同的 Glob Filter 可以实现不同的权限控制需求。以下是一个简单的示例来演示如何在 Glob Filter 中实现 Shiro 权限控制: 1. **添加 Shiro 依赖**: - 在项目中添加 Shiro 相关的依赖。 - 例如,在 Maven 中添加以下依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.8.0</version> </dependency>
创建 Glob Filter:
- 创建一个自定义的 Glob Filter,继承
PathMatchingFilter
并实现onPreHandle
方法。- 在
onPreHandle
方法中,使用 Shiro 进行权限验证并返回验证结果。- 例如,下面代码中的
MyGlobFilter
实现了对指定路径的管理员权限验证:public class MyGlobFilter extends PathMatchingFilter { @Override protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { Subject subject = SecurityUtils.getSubject(); // 验证是否有管理员角色 if (!subject.hasRole("admin")) { // 没有管理员角色,直接返回拒绝访问 HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } return true; } }
在 Shiro 配置中添加 Glob Filter:
- 在 Shiro 的配置文件中,添加自定义的 Glob Filter。
- 例如,在 Spring Boot 中可以在
application.yml
文件中添加以下配置:shiro: filter: myFilter: type: glob path: /admin/** filterClass: com.example.MyGlobFilter
将 Glob Filter 配置到 url 过滤链中:
- 在 Shiro 的配置文件中,将自定义的 Glob Filter 配置到 url 过滤链中。
- 例如,在 Spring Boot 中可以在
WebSecurityConfig
类的configure
方法中添加以下代码:@Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition(); chain.addPathDefinition("/admin/**", "myFilter"); chain.addPathDefinition("/**", "anon"); return chain; }
示例说明:
- 在上述示例中,我们创建了一个名为
MyGlobFilter
的自定义 Glob Filter,用于验证/admin/**
路径下的请求是否具有管理员权限。- 在 Shiro 的配置文件中,我们将
MyGlobFilter
配置到/admin/**
路径的 url 过滤链中,并设置anon
过滤器用于匹配所有其他路径。- 在执行请求时,Shiro 拦截器会根据 url 的路径匹配对应的过滤器,在
/admin/**
路径下的请求会被MyGlobFilter
进行管理员权限验证。通过以上方式,可以在 Glob Filter 中实现 Shiro 的权限控制,提高系统的灵活性和可扩展性。需要注意的是,在实际应用中,还需要考虑系统的具体权限控制需求,合理设置权限级别和角色划分,确保系统的安全性和稳定性。
集中式微服务调用:
- 设计一个专门的微服务,作为权限管理中心,负责统一的权限验证和授权操作。其他微服务在调用敏感接口时需要先访问权限管理中心进行权限验证。
- 权限管理中心可以集成 Shiro 框架,实现全局的权限控制和拦截。
示例的集中式微服务调用的设计: 1. **权限管理中心(Auth Service)**: - 这是一个独立的微服务,负责处理用户认证和权限管理。 - 在该微服务中集成 Shiro 框架,并进行相应的配置。 - 实现用户登录、权限验证、角色授权等功能接口。 2. **其他微服务**: - 其他微服务提供具体的业务功能,但不处理权限验证逻辑。 - 当需要进行敏感操作时,调用权限管理中心进行权限验证。 3. **流程示例**: - 用户在客户端登录,并请求访问某个敏感接口。 - 客户端将请求发送到权限管理中心。 - 权限管理中心通过 Shiro 进行用户身份验证和权限验证。 - 如果验证通过,权限管理中心返回许可给客户端。 - 客户端使用许可继续向目标微服务发送请求。 - 目标微服务收到请求并检查许可。 - 如果许可有效,目标微服务执行相应业务逻辑。 - 如果许可无效,目标微服务拒绝请求并返回错误信息。 以上设计,权限管理中心充当了一个鉴权中心的角色,统一处理权限验证和授权操作。其他微服务只需关注业务逻辑,而将权限验证的职责交给了权限管理中心。这样可以避免在每个微服务中都重复实现权限验证逻辑,提高了代码的复用性和可维护性。 需要注意的是,在实际应用中,还需要考虑权限管理中心的高可用性、安全性以及与其他微服务之间的通信方式等因素,并根据具体需求进行相应的调整和优化。
分布式拦截器模式:
- 在每个微服务中集成 Shiro 拦截器,用于拦截并验证请求。可以通过配置同一组的 Shiro 规则来确保各个微服务之间权限验证的一致性。
- 使用消息队列等机制实现跨服务的权限校验结果传递,确保整个微服务系统的请求在通过权限校验后才能正常访问。
简单的示例来说明这种设计: 微服务架构: 假设有两个微服务:Service A 和 Service B,它们都集成了 Shiro 拦截器用于权限验证。 Service A 负责用户管理,Service B 负责订单管理。 消息队列: 使用消息队列(如 RabbitMQ、Kafka 等)作为微服务之间通信的中间件,用于传递权限校验结果。 流程示例: 用户发起请求访问 Service B 的某个敏感接口。 Service B 的 Shiro 拦截器拦截该请求,并向消息队列发送一个权限校验请求消息,包括用户信息和请求信息。 Service A 收到消息队列中的权限校验请求消息后,使用自身的 Shiro 拦截器对用户进行权限验证。 Service A 将权限校验结果(通过或拒绝)发送回消息队列。 Service B 接收到权限校验结果后,根据结果决定是否继续处理该请求。 优点:
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
以上网络安全知识点!真正的体系化!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!