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


猜你喜欢
- Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。
- 最近接触了Android自定义控件,涉及到自定义xml中得属性(attribute),其实也很简单,但是写着写着,发现代码不完美了,就是在a
- 先准备好一个新闻实体类package com.zb.fragmentbestpractice/** * title:表示新闻的实体类 * c
- pom.xml文件需要的内容<dependency> <groupId>re
- 1.过滤器 (Filter)过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看
- Mybatis所需要的jar包:需要引用两个jar包,一个是mybatis,另一个是MySQL-connector-Java,如果是mave
- using System;using System.Collections.Generic;using System.IO;using Sy
- 继承JpaRepository,找不到findOne()方法问题:以前一直使用findOne(ID id);,这次用SpringBoot构建
- 本文实例讲述了C#实现json格式转换成对象并更换key的方法。分享给大家供大家参考。具体分析如下:由于是不标准的序列化对象类型,因此你无法
- Android作为一个伟大的系统,自然提供了设置默认打开程序的实现.在这篇文章中,我会介绍如何在Android系统中设置默认的程序. 在设置
- 背景大家在使用Selenium + Chromedriver爬取网站信息的时候,以为这样就能做到不被网站的反爬虫机制发现。但是实际上很多参数
- 1. 概述官方JavaDocsApi: java.awt.Component,java.awt.Containernull,绝对布局。绝对布
- 场景描述单例模式对于我们来说一点也不模式,是一个常见的名称,单例模式在程序中的实际效果就是:确保一个程序中只有一个实例,并提供一个全局访问点
- 1. 启动 Redis Server启动 redis server,如下图所示,端口号 6379:2. 工程实例2.1 工程目录工程目录如下
- 0.背景简介微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁。
- 注册中心呢 就是springcloud的一个核心组件 所有微服务的基石 微服务的核心思想就是分布式 所有的服务分开管理 但这些服务分开后该如
- 前言现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty...等等数都数不过来的软件,要满足通用性,
- 本文实例为大家分享了C#通过NPOI导入导出数据EXCEL的具体代码,供大家参考,具体内容如下其实从数据库到服务器导入导出有很多方法,但是比
- 当我们在登录像QQ邮箱这种大多数的网站,往往在登录按键上会有下次自动登录这个选项,勾选后登录成功,在一段时间内,即便退出浏览器或者服务器重启
- 一、去掉标题栏的方法第一种:入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_