在JAVA微服务项目中使用shiro全局拦截_shiro在微服务架构中如何使用

在微服务项目中使用 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>
  1. 创建 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;
        }
    }
    
  2. 在 Shiro 配置中添加 Glob Filter

    • 在 Shiro 的配置文件中,添加自定义的 Glob Filter。
    • 例如,在 Spring Boot 中可以在 application.yml 文件中添加以下配置:
    shiro:
      filter:
        myFilter:
          type: glob
          path: /admin/**
          filterClass: com.example.MyGlobFilter
    
  3. 将 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;
    }
    
  4. 示例说明

    • 在上述示例中,我们创建了一个名为 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年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

以上网络安全知识点!真正的体系化!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Spring Boot 使用 shiro 配置自定义过滤器需要以下几个步骤: 1. 引入 shiro-spring-boot-starter 依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> ``` 2. 创建自定义过滤器: ``` public class CustomFilter extends AccessControlFilter { @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { // 在这里实现自定义的过滤逻辑,返回 true 表示通过过滤器,返回 false 表示未通过过滤器 return true; } @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { // 如果 isAccessAllowed 返回 false,则会进入到这里,可以在这里处理未通过过滤器的情况 return false; } } ``` 3. 配置 shiro 的 FilterChainDefinition: ``` @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); // 添加自定义过滤器,其 key 是过滤器名称,value 是该过滤器对应的路径 chainDefinition.addPathDefinition("/custom/**", "custom"); return chainDefinition; } ``` 4. 配置自定义过滤器: ``` @Bean("custom") public CustomFilter customFilter() { return new CustomFilter(); } ``` 5. 配置 shiro 的注解支持: ``` @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } ``` 完成以上步骤后,就可以在 Spring Boot 使用 shiro 配置自定义过滤器了。 ### 回答2: 在 Spring Boot 使用 Shiro 配置自定义过滤器分为三个步骤。 第一步,创建自定义过滤器类。可以通过实现 Shiro 的 Filter 接口来创建自定义过滤器。在自定义过滤器需要实现过滤规则,并对请求进行相应的处理。 第二步,配置 Shiro 过滤器链。在 Spring Boot 的配置类,通过创建 ShiroFilterFactoryBean 对象来配置 Shiro 的过滤器链。可以使用 Shiro 的 FilterChainDefinitionMap 对象来配置过滤器链,然后将该对象设置给 ShiroFilterFactoryBean。 第三步,启用 Shiro 过滤器。在 Spring Boot 的配置类,通过创建 DefaultFilterChainManager 对象,并将该对象设置给 ShiroFilterFactoryBean,启用自定义过滤器。 有了以上三步,就可以在 Spring Boot 使用 Shiro 配置自定义过滤器了。可以通过在自定义过滤器实现过滤规则来对请求进行拦截或处理,然后在 Shiro 过滤器链配置该过滤器,最后启用该过滤器。这样就可以实现对请求的自定义过滤器处理。 值得注意的是,在使用 Shiro 进行自定义过滤器配置时,需要保证 Shiro 的配置文件已经进行了相应的配置,包括认证和授权等相关配置。只有在正确配置的前提下,才能正确使用 Shiro 进行自定义过滤器的配置。 ### 回答3: 在Spring Boot使用Shiro配置自定义过滤器通常需要以下几个步骤: 1. 引入Shiro和Spring Boot依赖。在pom.xml文件添加Shiro和Spring Boot Starter依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 创建自定义过滤器类。可以通过实现`javax.servlet.Filter`接口或者继承`org.apache.shiro.web.servlet.OncePerRequestFilter`类来创建自定义过滤器。例如,创建一个名为`CustomFilter`的自定义过滤器类: ``` public class CustomFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 过滤器逻辑处理 // ... filterChain.doFilter(request, response); } } ``` 3. 在Shiro配置类注册自定义过滤器。创建一个Shiro配置类,并使用`@Configuration`注解标记为配置类。通过`@Bean`注解将自定义过滤器注册到Shiro的过滤器链。例如,在配置类`ShiroConfig`注册`CustomFilter`: ``` @Configuration public class ShiroConfig { @Bean public FilterRegistrationBean<CustomFilter> customFilterRegistrationBean() { FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new CustomFilter()); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 过滤器执行顺序 registrationBean.addUrlPatterns("/*"); // 过滤器路径 return registrationBean; } } ``` 4. 配置Shiro的过滤规则。在Shiro配置文件,可以设置自定义过滤器的拦截规则。例如,在`shiro.ini`配置文件,设置自定义过滤器的拦截规则: ``` [urls] /** = customFilter // 对所有请求都使用自定义过滤器 ``` 通过以上步骤,在Spring Boot使用Shiro配置自定义过滤器就可以实现对特定请求的拦截和处理。在`CustomFilter`类的`doFilterInternal`方法编写自定义的过滤器逻辑,例如鉴权、权限验证等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值