【SpringSecurity】十三、基于Session实现授权认证

文章目录

  • 1、基于session的认证
  • 2、Demo
    • session实现认证
    • session实现授权

1、基于session的认证

在这里插入图片描述
流程:

  • 用户认证成功后,服务端生成用户数据保存在session中
  • 服务端返回给客户端session id (sid),被客户端存到自己的cookie中
  • 客户端下次再请求,就带上sid,服务端校验是否存在对应的session,存在则不要求用户再登录了

2、Demo

基于Session的认证机制由Servlet制定规范,Serlvet容器以实现,HttpSession相关方法:

方法用途
HttpSession getSession(Boolean create)获取当前HttpSession对象
void setAttribute(String name,Object value)向session中存放对象
object getAttribute(String name)从session中获取对象
void removeAttribute(String name);移除session中对象
void invalidate()使HttpSession失效

准备实体类:

@Data
public class AuthenticationRequestDto {/*** 用户名*/private String username;/*** 密码*/private String password;
}
@Data
@AllArgsConstructor
public class UserVo {private String id;private String username;private String password;private String fullname;private String mobile;
}

session实现认证

用Map模拟查询数据库,存储用户信息:

@Service
public class AuthenticationServiceImpl implements AuthenticationService {private final Map<String, UserVo> userMap = new HashMap<>();{userMap.put("zhangsan", new UserVo("1010", "zhangsan", "123", "zhangSan", "133443"));userMap.put("lisi", new UserVo("1011", "lisi", "456", "liSi", "144553"));}@Overridepublic UserVo auth(AuthenticationRequestDto dto) {if (dto == null|| StringUtils.isEmpty(dto.getUsername())|| StringUtils.isEmpty(dto.getPassword())) {throw new RuntimeException("账户或密码为空");}//模拟查询数据库UserVo vo = getUserVo(dto.getUsername());if (null == vo) {throw new RuntimeException("用户不存在");}if (!vo.getPassword().equals(dto.getPassword())) {throw new RuntimeException("密码错误");}return vo;}public UserVo getUserVo(String username) {return userMap.get(username);}}

定义三个接口,登录,服务端保存session,登出,让session失效。以及一个资源接口,查看当前是登录访问资源,还是未登录访问资源

@RestController
public class Controller {@Resourceprivate AuthenticationService authenticationService;@GetMapping(value = "/login")public String login(AuthenticationRequestDto dto, HttpSession session) {UserVo userVo = authenticationService.auth(dto);//用户信息存入sessionsession.setAttribute("sid", userVo);return userVo.getFullname() + " success login";}@GetMapping("/logout")public String logout(HttpSession session) {//让session失效session.invalidate();return " success logout";}@GetMapping("/r1")public String resource(HttpSession session) {String fullName = null;Object result = session.getAttribute("sid");if (result != null) {fullName = ((UserVo) result).getFullname();} else {fullName = "no login";}return fullName + " access resource ... ";}}

测试:

在这里插入图片描述

登录后访问资源接口:

在这里插入图片描述
退出登录后,再访问资源接口:

在这里插入图片描述
在这里插入图片描述

session实现授权

修改实体类,加个权限字段,存储用户权限

@Data
@AllArgsConstructor
public class UserVo {private String id;private String username;private String password;private String fullname;private String mobile;/*** 用户权限*/private Set<String> authorities;
}

实例代码块创建用户到map的代码做调整:

{Set<String> auth1 = new HashSet<>();auth1.add("p1");   //对应/r1这个接口资源Set<String> auth2 = new HashSet<>();auth2.add("p2");   //对应/r2这个接口资源userMap.put("zhangsan", new UserVo("1010", "zhangsan", "123", "zhangSan", "133443", auth1));userMap.put("lisi", new UserVo("1011", "lisi", "456", "liSi", "144553", auth2));}

加个测试资源接口/r2

@GetMapping("/r2")public String resource2(HttpSession session) {String fullName = null;Object result = session.getAttribute("sid");if (result != null) {fullName = ((UserVo) result).getFullname();} else {fullName = "no login";}return fullName + " access resource ... ";}

写拦截器:

@ComponentScan
public class SimpleAuthInterceptor implements HandlerInterceptor {/*** 校验用户请求的url是否在权限范围中*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//从http请求中获取session对象,再拿当前HttpSession对象Object object = request.getSession().getAttribute("sid");//没有认证if (object == null) {writeContent(response, "请登录");}UserVo userVo = (UserVo) object;//请求的urlString requestURI = request.getRequestURI();assert userVo != null;if (userVo.getAuthorities().contains("p1") && requestURI.contains("/r1")) {return true;}if (userVo.getAuthorities().contains("p2") && requestURI.contains("/r2")) {return true;}//拒绝访问writeContent(response,"没有权限,拒绝访问");return false;}private void writeContent(HttpServletResponse response, String msg) throws IOException {response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.print(msg);writer.close();}
}

拦截器add并放行/login,只测/r**接口

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {/*** 视图解析器*/@Beanpublic InternalResourceViewResolver viewResolver(){InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/static/");  //前缀viewResolver.setSuffix(".jsp");  //后缀return viewResolver;}@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("login");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SimpleAuthInterceptor()).addPathPatterns("/r**");   //新加进来的拦截器只针对r打头的接口,否则login接口也会被拦截要求登录}
}

测试,登录zhangsan,其有r1权限,访问r2接口:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio实现内容丰富的安卓校园二手交易平台(带聊天功能)

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号083 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看二手商品列表 3.发布二手商品 4.商品详情 5.聊天功能…

NodeJS 中的设计模式

Node.js 是一个流行的 JavaScript 运行时&#xff0c;允许开发者使用事件驱动、非阻塞 I/O 模型构建可扩展的网络应用程序。和任何复杂的框架一样&#xff0c;Node.js 应用程序可以从使用成熟的设计模式中受益&#xff0c;以促进代码重用、可维护性和健壮性。本文将概述一些对 …

在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理&#xff0c;模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色&#xff08;RGB值为0, 0, 0&#xff09;&a…

docker批量删除容器或镜像

删除容器 停止所有容器 删除所有容器&#xff0c;需要先停止所有运行中的容器 docker stop docker ps -a -q docker ps -a -q&#xff0c;意思是列出所有容器(包括未运行的)&#xff0c;只显示容器编号&#xff0c;其中 -a : 显示所有的容器&#xff0c;包括未运行的。 …

以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

文章目录 一、EIP——以太坊发展的基石1.1 什么是EIP&#xff1f;1.2 历史背景&#xff1a;前身的 BIP1.3 EIP的重要性1.4 流程&#xff1a;从提案到实施 二、进入 ERC——以太坊内的标准化协议2.1 解读 ERC&#xff1a;以太坊征求意见2.2 ERC 标准的诞生和意义 三、聚焦 ERC20…

如何动态修改spring中定时任务的调度策略(2)

上一篇文章中我们一下走读了一下spring中实现@Scheduled的源码,想必你对spring中实现定时调度的原理更加了解吧,文末我们两个问题, 1.spring在进行定时调度时,使用的线程池是默认,那么这个默认的线程池的配置是怎样的呢? 2.如何动态调整调度策略。 接下来我们详细分析一…

第四百一十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

在Linux/Ubuntu/Debian中使用iFuse访问iOS 设备(例如 iPhone 或 iPad)上的文件可双向复制粘贴

iFuse 是一款工具&#xff0c;可让你在 Linux 系统上安装 iOS 设备&#xff08;例如 iPhone 或 iPad&#xff09;&#xff0c;使你能够访问其文件系统并与设备传输文件。 以下是有关如何使用 iFuse 的基本指南&#xff1a; 安装依赖项&#xff1a;在安装 iFuse 之前&#xff0c…

go语言-基础元素与结构的使用

go基础元素与结构的使用&#xff0c;快速上手 编译go文件 编译为可执行文件 go build 文件名.go运行文件 ./文件名输入/输出 引用fmt库&#xff08;关于输入输出的库&#xff09; 输入 **scanf&#xff1a;**按照给定的格式依次读取数据&#xff08;包括非法数据&#xff…

计算机网络——HTTP

HTTP报文格式长什么样&#xff1f; HTTP报文它是由请求行&#xff0c;请求头&#xff0c;请求体组成的 请求行他是请求或响应的基本信息 请求头他是使用key-value格式可以更加详细的说明报文 请求体是传输的具体内容 是如何分割的&#xff1f; 请求行与请求头他是用\r\n来…

wireshark windows 抓包https

windows下 1.配置环境变量以生成ssl协商会话密钥日志记录 系统设置-》高级设置-》环境变量 新增环境变量 SSLKEYLOGFILE C:\Users\Public\Documents\SSLKEY\sslkey.log 打开公用共享文档创建SSLKEY文件夹用于后续系统存放协商密钥日志 2.配置Wireshark选项进行抓包 点击…

(一)Linux+Windows下安装ffmpeg

一丶前言 FFmpeg是一个开源的音视频处理工具集&#xff0c;由多个命令行工具组成。它可以在跨平台的环境中处理、转换、编辑和流媒体处理音视频文件。 FFmpeg支持多种常见的音视频格式和编解码器&#xff0c;可以对音视频文件进行编码、解码、转码、剪辑、合并等操作。它具有广…

最近火绒的explorer问题,电脑黑屏只有鼠标

由于安全限制&#xff0c;覆盖文件是行不通的&#xff0c;按照火绒官方给的方法试试&#xff0c;还是不行。主要是他最后一步写得有问题。恭喜火绒&#xff0c;成功的将我们所有客户的电脑安装的火绒卸载。 解决方案 1、CTRLSHIFTESC调出任务管理器&#xff1b; 2、左上角&am…

.net使用excel的cells对象没有value方法——学习.net的Excel工作表问题

$exception {"Public member Value on type Range not found."} System.MissingMemberException 代码准备运行问题解决1. 下载别的版本的.net框架2. 安装3. 运行 代码 Imports Excel Microsoft.office.Interop.Excel Public Class Form1Private Sub Button1_Click(…

「实战应用」如何用DHTMLX构建自定义JavaScript甘特图(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 当您声称您的产品具有高级定制功能时&#xff0c;客户一定会对产品进行严格测试&#xff0c;这个规则当然适用于DHTMLX Gantt&…

万用表革新升级,WT588F02BP-14S语音芯片助力智能测量新体验v

万能表功能&#xff1a; 万能表是一款集多功能于一体的电子测量工具&#xff0c;能够精准测量电压、电流、电阻等参数&#xff0c;广泛应用于电气、电子、通信等领域。其操作简便、测量准确&#xff0c;是工程师们进行电路调试、故障排查的得力助手&#xff0c;为提升工作效率…

Rust 中Self 关键字的两种不同用法

在 Rust 中&#xff0c;Self 是一个特殊的类型标识符&#xff0c;它代表了当前结构体或枚举类型。在结构体或枚举类型的定义中&#xff0c;Self 可以用于表示该类型的任何地方&#xff0c;包括方法签名、构造函数、类型别名等。 构造函数中的 Self&#xff1a; 在这段代码中&a…

大语言模型数据集alpaca羊驼数据集、Vicuna骆马数据集异同、作用、使用领域

文章目录 大语言模型数据集alpaca羊驼数据集、Vicuna骆马数据集异同、作用、使用领域Alpaca和Vicuna简介AlpacaVicuna相同点不同点 alpaca、vicuna能否用在大语言模型微调中&#xff1f;alpaca、vicuna进行大语言模型微调时&#xff0c;由于其已经是标准化数据集&#xff0c;还…

奥特曼剧透GPT-5,将在高级推理功能上实现重大进步

奥特曼&#xff1a;“GPT-5的能力提升幅度将超乎人们的想象...” 自 Claude 3 发布以来&#xff0c;外界对 GPT-5 的期待越来越强。毕竟Claude 3已经全面超越了 GPT-4&#xff0c;成为迄今为止最强大模型。 而且距离 GPT-4 发布已经过去了整整一年时间&#xff0c;2023年3月1…

2024年区块链、电子信息与计算机工程国际会议(ICBEICE 2024)

2024年区块链、电子信息与计算机工程国际会议&#xff08;ICBEICE 2024&#xff09; 2024 International Conference on Blockchain, Electronic Information and Computer Engineering 会议简介&#xff1a; 2024年区块链、电子信息与计算机工程国际会议&#xff08;ICBEIC…