在 Spring Boot 中,可以使用拦截器或过滤器来实现权限控制,无需依赖 Shiro。本文将详细介绍实现步骤,并提供代码示例。

  1. 创建自定义拦截器或过滤器

    • 继承 HandlerInterceptorAdapter 类实现拦截器:

      public class CustomInterceptor extends HandlerInterceptorAdapter {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              // 实现权限控制逻辑
              return true;
          }
      }
      
    • 实现 javax.servlet.Filter 接口实现过滤器:

      public class CustomFilter implements Filter {
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
              // 初始化操作
          }
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              // 实现权限控制逻辑
              filterChain.doFilter(servletRequest, servletResponse);
          }
      
          @Override
          public void destroy() {
              // 销毁操作
          }
      }
      
  2. 注册拦截器或过滤器到拦截器链或过滤器链中

    • 使用 @Configuration 注解和 @Bean 注解配置拦截器:

      @Configuration
      public class AppConfig {
          @Bean
          public CustomInterceptor customInterceptor() {
              return new CustomInterceptor();
          }
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(customInterceptor()).addPathPatterns("/**");
          }
      
          @Bean
          public CustomFilter customFilter() {
              return new CustomFilter();
          }
      
          @Override
          public void configure(WebSecurity web) throws Exception {
              web.addFilterBefore(customFilter(), BasicAuthenticationFilter.class);
          }
      }
      
  3. 创建权限表和角色表,并进行数据填充

    • 创建权限表:

      CREATE TABLE permission (
          id INT PRIMARY KEY AUTO_INCREMENT,
          name VARCHAR(50) NOT NULL
      );
      
    • 创建角色表:

      CREATE TABLE role (
          id INT PRIMARY KEY AUTO_INCREMENT,
          name VARCHAR(50) NOT NULL,
          description VARCHAR(200) DEFAULT NULL
      );
      
    • 创建角色权限表:

      CREATE TABLE role_permission (
          id INT PRIMARY KEY AUTO_INCREMENT,
          role_id INT NOT NULL,
          permission_id INT NOT NULL,
          FOREIGN KEY (role_id) REFERENCES role(id),
          FOREIGN KEY (permission_id) REFERENCES permission(id)
      );
      
    • 插入数据:

      -- 插入权限数据
      INSERT INTO permission (name) VALUES ('admin');
      INSERT INTO permission (name) VALUES ('user');
      
      -- 插入角色数据
      INSERT INTO role (name, description) VALUES ('admin', '管理员');
      INSERT INTO role (name, description) VALUES ('user', '普通用户');
      
      -- 插入角色权限数据
      INSERT INTO role_permission (role_id, permission_id) VALUES (1, 1);
      INSERT INTO role_permission (role_id, permission_id) VALUES (2, 2);
      
  4. 在控制器中,使用 @PreAuthorize 注解实现方法级别的权限控制

    • 使用 @PreAuthorize 注解指定需要的权限或角色:

      @RestController
      public class UserController {
          @PreAuthorize("hasAuthority('admin')")
          @GetMapping("/admin")
          public String admin() {
              return "Hello admin!";
          }
      
          @PreAuthorize("hasAuthority('user')")
          @GetMapping("/user")
          public String user() {
              return "Hello user!";
          }
      }
      

以上就是在 Spring Boot 中使用拦截器或过滤器实现权限控制,并使用数据库中的权限表和角色表进行权限管理的步骤。

注意:

  • 具体实现需要根据实际需求调整,如用户认证、角色和权限的获取等。
  • 可以使用 Spring Security 等框架来简化权限管理的实现。
  • 建议使用 Spring Security 的 @PreAuthorize 注解来实现方法级别的权限控制,它提供了更加丰富的表达式语法。

希望本文能够帮助您在 Spring Boot 中实现高效的权限控制!

SpringBoot 拦截器/过滤器权限控制:不使用Shiro实现数据库权限管理

原文地址: https://www.cveoy.top/t/topic/oaAR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录