在微服务项目中使用 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> ``` 2. **创建 Glob Filter**: - 创建一个自定义的 Glob Filter,继承 `PathMatchingFilter` 并实现 `onPreHandle` 方法。 - 在 `onPreHandle` 方法中,使用 Shiro 进行权限验证并返回验证结果。 - 例如,下面代码中的 `MyGlobFilter` 实现了对指定路径的管理员权限验证: ```java 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; } } ``` 3. **在 Shiro 配置中添加 Glob Filter**: - 在 Shiro 的配置文件中,添加自定义的 Glob Filter。 - 例如,在 Spring Boot 中可以在 `application.yml` 文件中添加以下配置: ```yaml shiro: filter: myFilter: type: glob path: /admin/** filterClass: com.example.MyGlobFilter ``` 4. **将 Glob Filter 配置到 url 过滤链中**: - 在 Shiro 的配置文件中,将自定义的 Glob Filter 配置到 url 过滤链中。 - 例如,在 Spring Boot 中可以在 `WebSecurityConfig` 类的 `configure` 方法中添加以下代码: ```java @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition(); chain.addPathDefinition("/admin/**", "myFilter"); chain.addPathDefinition("/**", "anon"); return chain; } ``` 5. **示例说明**: - 在上述示例中,我们创建了一个名为 `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 接收到权限校验结果后,根据结果决定是否继续处理该请求。 优点: 实现了微服务之间的权限校验结果共享,确保了一致性。 各个微服务只需关注自身的业务逻辑,权限验证逻辑集中在各自的 Shiro 拦截器中。 通过消息队列异步通信,提高了系统的并发处理能力和整体性能。 需要注意的是,在实际应用中,还需要考虑消息队列的可靠性、安全性以及权限校验结果的有效期等因素。同时,根据具体业务需求和系统规模,可以进一步扩展和优化这种分布式拦截器模式的设计方案。
-
基于注解的权限控制:
- 在每个微服务中使用 Shiro 的注解方式来标记需要进行权限控制的接口或方法,让 Shiro 拦截器在请求到达时根据注解进行权限验证。
- 这种方式可以保持代码的清晰度,将权限控制逻辑直接体现在代码中,便于维护和管理。
基于注解的权限控制是一种常见的做法,可以让权限控制逻辑直接体现在代码中,提高代码的清晰度和可维护性。以下是一个简单的示例来演示如何在每个微服务中使用 Shiro 的注解方式进行权限控制: 1. **在每个微服务中配置 Shiro**: - 在每个微服务中集成 Shiro,并配置相应的拦截器和权限管理策略。 - 确保每个微服务都能够独立进行权限验证。 2. **使用注解标记权限控制**: - 在需要进行权限控制的接口或方法上使用 Shiro 的注解来标记需要的权限级别。 - 例如,在需要进行管理员权限验证的接口上添加 `@RequiresRoles("admin")` 注解。 3. **拦截器进行权限验证**: - 当请求到达时,Shiro 拦截器会检查该请求对应的方法或接口是否被标记了权限控制的注解。 - 如果有权限控制的注解,拦截器会根据注解配置的权限要求进行验证。 4. **示例代码**: ```java // 示例Controller @RestController public class OrderController { @Autowired private OrderService orderService; // 需要管理员权限才能访问的接口 @RequiresRoles("admin") @GetMapping("/orders") public List<Order> getAllOrders() { return orderService.getAllOrders(); } } ``` 5. **注意事项**: - 确保每个微服务都正确配置了 Shiro 拦截器和权限管理策略。 - 在设计注解时,考虑系统的权限控制需求,合理设置权限级别和角色划分。 - 通过合理使用注解,避免在每个方法中重复编写权限验证逻辑,提高代码的复用性和可维护性。 通过以上方式,可以在每个微服务中使用注解来进行权限控制,使得权限验证逻辑清晰可见,同时保证了各个微服务之间的独立性和灵活性。