Java SpringBoot 使用 * 作为权限控制的实现方法

作者:New_HackerHK 时间:2023-04-18 01:41:58 

如何实现

首先 * 是属于web这块的,那我们需要引入springboot web模块,具体版本在parent中


<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后我们在config目录下新建interceptor目录,用来放 *

  • 我们新建两个 * ,一个用来登陆拦截,一个用来进行管理员拦截。

  • 登陆拦截不必多说,就是判断除登陆请求外所有请求是否登陆过,没有我们就截断请求,然会返回失败状态

  • 管理员拦截,拦截的是管理员才能访问的资源,比如用户管理/权限管理等,它是登陆拦截放行后才能进行的,

  • 就像关卡是一关一关的。登陆验证后进入管理员验证,判断该登陆用户是否具有管理员权限,若拥有则放行,否则拦截并返回失败状态

  • * 的核心是实现 org.springframework.web.servlet.HandlerInterceptor 接口,验证逻辑一般写在 preHandle 方法中,在请求资源前

  • 我的验证逻辑比较简单,登陆验证就是从session中取出用户信息,判断是否存在,用户信息是登陆成功时放入session中的,大家也可以使用JWT验证

  • 管理员验证也是从session中取出管理员信息,判断是否是管理员,管理员信息是登陆成功时将是否是管理员的信息放入session中的,大家也可以使用JWT验证

登陆 *


package com.example.interceptor_demo.config.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* * ,登录检查
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {

@Autowired
   private HttpSession session;

@Autowired
   private ObjectMapper objectMapper;

@Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
           throws Exception {
       Object user = session.getAttribute("sessionUser");
       if (sessionUser!=null){
           return true;
       }else {
           Map<String,Object> notLogin = new HashMap<>();
           notLogin.put("msg","not login");
           notLogin.put("code",403);
           notLogin.put("data",null);
           try(PrintWriter printWriter = response.getWriter()){
               printWriter.print(objectMapper.writeValueAsString(notLogin));
           }catch (Exception e){
               e.printStackTrace();
           }
           return false;
       }
   }

@Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                          ModelAndView modelAndView) throws Exception {

}

@Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
   }

}

管理员 *


package com.example.interceptor_demo.config.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* * ,管理员验证
*/
@Component
public class AdminInterceptor implements HandlerInterceptor {

@Autowired
   private HttpSession session;

@Autowired
   private ObjectMapper objectMapper;

@Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
           throws Exception {
       Boolean isAdmin = (Boolean)session.getAttribute("sessionAdmin");
       if (isAdmin!=null && isAdmin){
           return true;
       }else {
           Map<String,Object> notLogin = new HashMap<>();
           notLogin.put("msg","no power");
           notLogin.put("code",403);
           notLogin.put("data",null);
           try(PrintWriter printWriter = response.getWriter()){
               printWriter.print(objectMapper.writeValueAsString(notLogin));
           }catch (Exception e){
               e.printStackTrace();
           }
           return false;
       }
   }

@Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                          ModelAndView modelAndView) throws Exception {

}

@Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
   }

}

最后我们在config目录下新建WebMvcConfig类,用来注册 *

  • * 注册类的核心是实现 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 接口

  • 实现 addInterceptors 方法,参数 registry 对象可用来注册 *

  • registry.addInterceptor() 方法用来添加 *

  • .addPathPatterns() 方法是为该 * 添加拦截资源路径

  • .excludePathPatterns() 方法是为该 * 添加要放行的资源路径

  • 其中 * 代表路径下任意名称,** 代表任意路径下任意名称


package com.example.interceptor_demo.config;

import com.example.interceptor_demo.config.interceptor.AdminInterceptor;
import com.example.interceptor_demo.config.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

@Autowired
   private LoginInterceptor loginInterceptor;

@Autowired
   private AdminInterceptor adminInterceptor;

@Override
   public void addInterceptors(InterceptorRegistry registry) {
       this.loginInterceptor(registry);//登录拦截        
       this.adminInterceptor(registry);//管理员拦截
   }

private void loginInterceptor(InterceptorRegistry registry){
       registry.addInterceptor(loginInterceptor)
               .addPathPatterns("/**")
               .excludePathPatterns(//释放登陆接口
                       "/login/**"
               );
   }

private void adminInterceptor(InterceptorRegistry registry){
       registry.addInterceptor(htmlPageInterceptor)
               .addPathPatterns("/admin/**");//拦截管理员接口
   }
}

来源:https://www.cnblogs.com/New-HackerHK/p/15176720.html#4950599

标签:Java,SpringBoot, ,
0
投稿

猜你喜欢

  • Android图片加载利器之Picasso扩展功能

    2023-05-14 15:12:33
  • Spring Cloud Config配置文件使用对称加密的方法

    2021-08-09 08:50:02
  • java mail使用qq邮箱发邮件的配置方法

    2023-07-02 07:58:56
  • Flutter 如何封装文本输入框组件

    2023-09-27 02:54:51
  • 详解Java中final的用法

    2022-09-22 10:20:32
  • bs架构和cs架构的区别_动力节点Java学院整理

    2021-09-18 22:06:18
  • SpringSecurity整合jwt权限认证的全流程讲解

    2022-02-20 09:58:36
  • Java接口中尽量避免使用数组

    2022-07-06 23:24:14
  • 关于springboot配置druid数据源不生效问题(踩坑记)

    2021-08-04 13:46:08
  • MyBatis快速入门(简明浅析易懂)

    2022-05-25 23:08:55
  • Android 仿苹果IOS6开关按钮

    2023-11-21 15:16:08
  • C# Chart 简单使用教程

    2021-05-29 07:41:34
  • Java中的synchronized 优化方法之锁膨胀机制

    2023-10-02 03:44:15
  • Spring Security中用JWT退出登录时遇到的坑

    2022-05-19 10:30:28
  • eclipse 如何创建 user library 方法详解

    2021-12-29 00:33:56
  • 在SpringBoot项目中的使用Swagger的方法示例

    2022-01-04 15:14:39
  • Java设计模式之抽象工厂模式

    2022-05-30 12:45:16
  • Java异常处理try catch的基本使用

    2023-11-24 05:04:38
  • Java中File类方法详解以及实践

    2021-09-13 05:58:16
  • IDEA 快速返回上次查看代码的位置的方法

    2022-10-23 01:49:59
  • asp之家 软件编程 m.aspxhome.com