SpringSecurity 5

server/2024/9/19 22:36:46/ 标签: java, 前端, 服务器

Spring认证和授权异常处理_exceptionhandling().authenticationentrypoint-CSDN博客 

        springSecurity是spring的一个顶级项目 也是一个安全框架,可以在spring框架中直接引用。

        springSecurity基于RBAC用来处理登录功能和各种权限校验。

〇、配置和运行springSecurity

         导入security启动器和web启动器,写一个springBoot的启动类,可以直接在springboot项目中运行security框架。

        1)配置

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

         2)启动并访问

            3)默认登录用户

                        默认的密码直接在控制台打印出来了

                        默认的用户名是user

           3.5)修改默认用户配置     

                        

           4)登录成功

                        没有进行任何配置,404就登录成功了。



〇点五、关闭csrf防护

        csrf防护是security框架默认开启的安全机制。

        每次向服务器发送请求时,响应界面中都会携带一个token字符串,再次提交表单会携带此字符串和服务器中存储的token比较。

        如果没有该防护,用户登录security项目,再访问第三方网站:

                这时第三方网页中内嵌有security项目的相关url请求,

                用户就在无意识中跟随第三方的意识访问了security项目,

                而这个访问可以是提交表单,修改数据,转账操作。

        要使用csrf防护机制也很简单

        只需要在界面中添加name值为_csrf    的隐藏域

        每次发送请求携带此键值对就ok。

        这里学习security框架时可以先行关闭csrf防护,具体操作是在全局配置调用方法                  http.csrf().disable();



一、全局配置      放行登录url

           1)创建配置类

                     WebSecurityConfigurerAdapter是默认的security框架全局配置类,

                      security框架调用的配置方法为该类的configure(HttpSecurity http),

                     修改全局配置只需要新建一个继承该类的配置类重写该方法。

        2)创建登录界面 和 登录控制器

                2.1)使用thymeleaf技术创建界面login.html

                                这里用户名默认为username

                                           密码默认为password

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

   

        3)在配置类中配置 表单、用户请求 的访问规则

http.formLogin().loginProcessingUrl("/login")   //用户发送登录表单请求的url,会执行登录认证.successHandler((request, response, authentication) ->{request.getRequestDispatcher("/index").forward(request,response);})                 //成功后的自定义处理.failureForwardUrl("/404")    //失败的处理.loginPage("/myLogin");       //登录网址
http.authorizeRequests().antMatchers("/myLogin").permitAll() //.antMatchers("拦截路径")permitAll()表示放行         .anyRequest().authenticated(); //拦截所有的请求进行登录认证,校验是否登录
http.csrf().disable();                 //关闭csrf防护

        4)测试



 二、自定义用户名密码检验规则  

     1)重写校验类,实现自定义校验        

                需要实现一个接口UserDetailsService,这个接口其实是security框架提供给我们的自定义校验的接口,

                实现该接口,生成该实现类对象的话,security框架就不会使用默认的内置接口实现类对象进行校验。

                

       2)在配置类的配置方法中配置密码解析器

                        



三、remember-me记住我  

             0)security完成的接口调用

                        使用记住我功能登录security框架以后,关闭浏览器后直接访问该项目,无需再次登录,记住我功能在浏览器cookie中存储了一个token字符串,并在数据库中也存储该token。

                        再次打开浏览器,不仅会校验token值,也会根据token表中记录的用户名校验用户表,如果token值一样,但是用户表中没有查询相关用户信息仍然不通过。

             1)   登录界面添加值为true,键名为remember-me的复选框

           2)配置dataSource对象需要的依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>

         3)注入dataSource提供给security框架token表操作对象jdbcTokenRepository

         4)在配置类中写一个配置对象jdbcTokenRepository完成数据库表初始化

                     jdbcTokenRepository对象创建了表结构,并连接数据库检验token值

 @Beanpublic JdbcTokenRepositoryImpl jdbcTokenRepository(){JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();jdbcTokenRepository.setDataSource(dataSource);
//        jdbcTokenRepository.setCreateTableOnStartup(true);return jdbcTokenRepository;}

         5)设置rememberMe配置

                        把用户名校验对象userDetailsService和token表操作对象jdbcTokenRepository扔进去完成rememberMe配置

   //配置RememberMe相关信息:http.rememberMe().userDetailsService(userDetailsService) //调用其完成用户信息的查询.tokenRepository(jdbcTokenRepository) ; //调用其完成token的校验
//                .tokenValiditySeconds(3600*24*3) ;//设置token的有效期,单位秒
//                .rememberMeParameter("wollo");//设置记住我请求数据的键名


四、session会话管理

        在security框架的全局配置中:

                  session会话失效后使用InvalidSessionStrategy类的方法处理时总是需要加上这样一句话request.getSession(),因为所有会话无效的请求都会自动调用该方法。为了避免自循环创建一个有效的会话对象。

    // 会话配置http.sessionManagement(session ->{// 会话失效跳转的页面//       session.invalidSessionUrl("/login");// 会话失效处理器session.invalidSessionStrategy(new InvalidSessionStrategy() {@Overridepublic void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {request.getSession();response.sendRedirect("/login");}});//最大并发会话数,设置单个用户允许同时在线的最大会话数,重新登录的会话会踢掉旧的会话.session.maximumSessions(1);});



五、使用access表达式实行指定url访问控制

        1)在ExpressionInterceptUrlRegistry类中封装好了许多常用的access表达式:

        


        2)自己写一个access表达式

                2.1)封装好的denyAll()和access("denyAll()")一样的效果。

               2.2)自定义校验方法

                                这里access表达式调用方法时规则:

                                        使用@符号调用方法

                                        写bean的id及调用方法

                                        参数名必须叫request,authentication



六、用户退出功能

        1)security默认的登出url请求: /out

                不需要任何配置,只需要发送请求就能实现登出功能。

                2)配置类中 自定义  登出配置

     //登出配置http.logout().logoutUrl("/out").logoutSuccessUrl("/myLogin")  //成功的跳转路径
//                         .logoutSuccessHandler(new LogoutSuccessHandler() {
//                             @Override
//                             public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
//                                 response.sendRedirect("/myLogin");
//                             }
//                         })    //自定义逻辑实现成功跳转.clearAuthentication(true)  //清除登录状态.invalidateHttpSession(true) ; //销毁session

                 3)踢出指定用户

                        3.1)配置类中创建sessionRegistry对象

                            3.2)控制器中实现踢出方法

public void kickOutUser(String username) {// 1.获取全部登录用户List<Object> allPrincipals = sessionRegistry.getAllPrincipals();// 2.遍历全部登录用户,找到要强制登出的用户for (Object principal : allPrincipals) {UserDetails userDetail = (UserDetails) principal;if (username.equals(userDetail.getUsername())) {// 3.找到认证用户所有的会话,不包含过期会话List<SessionInformation> sessions = sessionRegistry.getAllSessions(userDetail, false);if (null != sessions && !sessions.isEmpty()) {// 4.遍历该用户的会话,使其立即失效for (SessionInformation session : sessions) {session.expireNow();}}}}}



七、权限校验

              1)配置类中使用access表达式实现权限校验

                      两个hasRole方法是不同类实现的

                                前者必须加ROLE_。


       2)使用注解实现权限校验

   



八、security框架异常401 403处理 

        针对认证和授权两种功能,认证失败通常抛出401,授权失败抛出403


http://www.ppmy.cn/server/117673.html

相关文章

SVN笔记-SVN安装

SVN笔记-SVN安装 1、在windows下安装 SVN 1、准备svn的安装文件 下载地址&#xff1a;https://sourceforge.net/projects/win32svn/ 2、下载完成后&#xff0c;在相应的盘符中会有一个Setup-Subversion-1.8.17.msi的文件&#xff0c;目前最新的版本是1.8.17&#xff0c; 这里…

Windows 安装 ZooKeeper 以及 IDEA 安装 zoolytic 连接工具

目录 前言 下载 解压 配置 启动服务 zoolytic 前言 在前公司做微服务开发时&#xff0c;使用的都是 Spring Cloud 的生态&#xff0c;服务的注册与发现中心用的 Eureka&#xff0c;也有使用 Nacos 的&#xff0c;远程调用则是用的 OpenFeign&#xff0c;换工作后&#x…

http网络请求与下载进度

Http_request 目录 一、XMLHttpRequest 在使用 Fetch API 进行网络请求时&#xff0c;原生的 Fetch API 并不直接支持获取下载进度的功能&#xff0c;因为 Fetch API 主要是基于 Promise 的&#xff0c;它主要关注于请求的成功或失败&#xff0c;以及响应数据的处理&#xff…

xml中SQL执行错误(使用另外一张表的两个字段,组装SQL的where查询条件)

SQL实现功能描述&#xff1a;根据系统设置中的商店到期提醒周期、单位&#xff0c;在过期提醒的列表中&#xff0c;对数据进行周期展示 错误复现&#xff1a; Mapper接口中抽象方法的定义如下&#xff1a; Page<ShopVo> queryList(Param(“vo”) ShopVo shopVo ,Page&…

四个pdf软件分享,你更爱哪一款?

如果说现在用的最多的电子文档是什么&#xff0c;不是Word就是PDF&#xff0c;所以PDF编辑器几乎成了我们日常工作中不可或缺的工具。但面对市面上琳琅满目的PDF编辑器&#xff0c;到底哪一款才是你的菜呢&#xff1f;今天&#xff0c;我就来和大家聊聊我用过的四款编辑器&…

部署Prometheus+Grafana批量监控Linux服务器

在 Linux 服务器上使用 Docker 容器快速部署 Prometheus 和 Grafana 监控系统&#xff0c;同时通过 node_exporter 采集全面的系统性能数据。整个流程涵盖了从环境配置到搭建一个全面监控平台的每个步骤。 一键安装Node Exporter Node Exporter 是 Prometheus 生态系统中的一个…

Nacos与Eureka的区别:深入解析微服务中的服务注册与发现

在微服务架构中&#xff0c;服务注册与发现是确保各个服务之间高效通信与协调的重要机制。随着云原生应用的快速发展&#xff0c;服务治理的需求也在不断增长。在这一背景下&#xff0c;Nacos和Eureka作为两种主流的服务注册与发现工具&#xff0c;各具特色和优势。本文将深入分…

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun&#xff0c;它的功能是:除了字符串前导的*号之外&#xff0c;将串中其它*号全部删除。在编写函数时&#xff0c;不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如&#xff0c;字符串中的内容为:-**…

GBase 8s数据类型与java.sql.Types对应关系

GBase 8s数据类型与java.sql.Types对应关系 GBase 8s类型类型java.sql.Typesjava类型名称SMALLINT5SMALLINTINTEGER4INTEGERBIGINT-5BIGINTINT8-5BIGINTSMALLFLOAT7REALFLOAT8DOUBLEDECIMAL3DECIMALMONEY3DECIMALCHAR1CHARNCHAR1CHARVARCHAR12VARCHARNVARCHAR12VARCHARVARCHAR…

基于Vue.js的超市商品管理导购中心设计与实现(任务书)

本科毕业论文&#xff08;设计&#xff09;任务书 学院&#xff1a;数学与数据科学学院 学生姓名 专业班级 信息与计算科学202班 学号 校内指导教师姓名 职称/职务 副教授 签名 校外指导教师姓名 职称/职务 工程师 签名 论文题目 基于Vue.js的超市商品管理导购中心 起始日期…

Web安全与网络安全:SQL漏洞注入

Web安全与网络安全&#xff1a;SQL漏洞注入 引言 在Web安全领域&#xff0c;SQL注入漏洞&#xff08;SQL Injection Vulnerability&#xff09;是一种极具破坏性的安全威胁。它允许攻击者通过向Web应用程序的输入字段中插入或“注入”恶意的SQL代码片段&#xff0c;从而操纵后…

uni-app 应用名称 跟随系统语言 改变

官方已确认BUG:&#xff1a;https://ask.dcloud.net.cn/question/164804 { "name" : "%app.name%",//这里随便写&#xff0c;配置了 locales,name 就不生效了 "appid" : "", "description" : "", "versi…

Pytorch详解-Pytorch核心模块

Pytorch核心模块 一、Pytorch模块结构_pycache__Cincludelibautogradnnoptimutils 二、Lib\site-packages\torchvisiondatasetsmodelsopstransforms 三、核心数据结构——Tensor&#xff08;张量&#xff09;在深度学习中&#xff0c;时间序列数据为什么是三维张量&#xff1f;…

基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)

目标&#xff1a; 当我的手指在设备左方进行上下移动的时候&#xff0c;可以进行屏幕亮度的调节&#xff0c;在调节的同时&#xff0c;有实时的调节进度条显示 步骤&#xff1a; 界面逻辑&#xff1a;使用Stack() 组件&#xff0c;完成音量图标和进度条的组合显示&#xff0c…

Kubernetes Pod镜像的3种状态

Kubernetes Pod镜像的3种状态 1. Pending状态2. Running状态3. Unknown状态💖The Begin💖点点关注,收藏不迷路💖 1. Pending状态 定义:Pod已被创建但尚未启动。 原因: 资源不足(CPU、内存等)。调度策略或标签选择器不匹配。镜像正在从仓库下载中。解决方案:检查资…

java 网络编程URL与URLConnection的使用

Java中的网络编程不仅限于Socket编程&#xff0c;还包括使用java.net.URL和java.net.URLConnection来进行简单的网络请求和数据获取。URL类用于表示统一资源定位符&#xff08;Uniform Resource Locator&#xff09;&#xff0c;而URLConnection类提供了与URL进行通信的功能。下…

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

【无人机设计与控制】四旋翼飞行无人机姿态控制ADRC非线性自抗扰控制Simulink仿真

摘要 本研究针对四旋翼飞行无人机姿态控制&#xff0c;提出了一种基于非线性自抗扰控制&#xff08;ADRC&#xff09;的控制策略。通过Simulink对系统进行了建模和仿真&#xff0c;验证了所设计控制器在不同工况下的有效性和鲁棒性。仿真结果表明&#xff0c;所设计的控制器能…

TensorFlow 笔记

------------------------------- 1. 创建模型阶段 ------------------------------- 1. Activation 激活函数&#xff0c; 属于模型的一个层&#xff0c;可以用于中间层&#xff0c;输出层。 ReLU (Rectified Linear Unit), 修正线性单元&#xff0c;即 max(0, x)&#xff…

【目标检测数据集】锯子数据集1107张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1107 标注数量(xml文件个数)&#xff1a;1107 标注数量(txt文件个数)&#xff1a;1107 标注…