SpringSecurity 5

news2024/11/15 19:49:29

        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值

 @Bean
    public 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() {
                   @Override
                   public 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处理 

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

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

相关文章

VMamba: Visual State Space Model 论文总结

题目&#xff1a;VMamba: Visual State Space Model&#xff08;视觉状态空间模型&#xff09; 论文&#xff1a;[2401.10166] VMamba: Visual State Space Model (arxiv.org) 源码&#xff1a;https://arxiv.org/pdf/2401.10166 (github.com) 目录 一、摘要 二、引言 三、方…

URP 线性空间 ui资源制作规范

前言&#xff1a; 关于颜色空间的介绍&#xff0c;可参阅 unity 文档 Color space URP实现了基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui资源在unity中进行透明度混合时&#xff…

嵌入式常用轻量级校验算法

在嵌入式中涉及通信基本都需要用到校验算法&#xff0c;如&#xff1a;UART常用的奇偶校验、CAN通信常用的CRC校验等等。下面我们将介绍几种常用的校验算法&#xff1a; 一、校验和 校验和是最基本&#xff0c;也是嵌入式软件工程师最常用的一种校验算法&#xff0c;其实现方法…

jdk知识

jdk,jre,jvm jdk>jre>jvm jdk的bin目录下有编译工具&#xff0c;平时写完java文件用jdk编译&#xff1b; jre的lib文件夹里面是java的jar包(.class文件)&#xff0c;用来给jvm运行编译后的.class文件。 jvm&#xff1a;运行.class文件&#xff0c;.class文件读入到虚拟机…

JVM 垃圾回收机制和GC案例分析

1. 引言 Java 虚拟机&#xff08;JVM&#xff09;的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制&#xff0c;是自动内存管理的重要组成部分。它通过回收不再使用的对象&#xff0c;避免手动释放内存的麻烦。然而&#xff0c;随着系统复杂性的增加&#xff0c…

C/C++——野指针处理

在C++中,“野指针”(dangling pointer)指的是指向已释放或无效内存的指针。使用野指针可能导致程序崩溃或产生未定义行为。避免野指针的关键在于确保指针始终指向有效内存。下面是一些避免野指针的方法和最佳实践: 1、释放内存后置空指针 当释放掉分配的动态内存后,将指…

文本到3D生成

文本到3D生成是一种通过文本描述直接创建三维数字模型的技术。这种技术能够将语言描述转换成可视化的三维模型&#xff0c;使得内容创作者和设计师可以直接从概念阶段跳转到三维可视化&#xff0c;大大加快创作流程并提供更直观的设计和修改过程。 该技术的核心应用之一是基于…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计&#xff1a;大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域&#xff0c;将图形拖拽到画布进行编辑&#xff0c;绘制大屏。 1.2 菜单栏 顶部菜单导航&#xff0c;一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助&#xff0c;设置大…

MySQL篇(SQL - 分类)(持续更新迭代)

目录 简介 一、DDL 1. 简介 2. 数据库操作 2.1. 查库 查询所有数据库 查询当前数据库 2.2. 创库 2.3. 删库 2.4. 切库 3. 表操作 3.1. 查询 查询当前数据库所有表 查看指定表结构 查询指定表的建表语句 3.2. 创表 3.3. 改表 添加字段 修改数据类型 修改字段…

unity3d入门教程六

unity3d入门教程六 15.1预制体15.2编辑预制体15.3在场景中编辑15.4动态创建实例15.5实例的销毁16.1&#xff08;练习&#xff09;子弹发射16.2定时器16.3键盘事件 15.1预制体 火神山10天建成&#xff0c;使用了预制体技术 一个个小房间都是事先建造好的&#xff0c;最后吊车装…

Acrobat 2022 安装

软件介绍 Adobe Acrobat 是由Adobe公司开发的一款PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑软件。借助它&#xff0c;可以以PDF格式制作和保存文档&#xff0c;以便于浏览和打印&#xff0c;同时还可以使用一些高级工具来创建、编辑…

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后&#xff0c;在系统启动时&#xff0c;会自动启动MySQL服务&#xff0c;无需手动启动。 也可以手动的通过指令启动停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; 1 、 net start mysql80…

Autosar E2E通信保护简介

文章目录 前言一、E2E基本概念二、为什么要做E2E?三、E2E保护的三种不同实现方式E2E TransformerE2E Protection Wrapper(E2EPW)COM E2E Callout四、E2E ProfileE2E Profile 01 机制E2E Profile 02 机制E2E Profile 04 机制E2E Profile 05 机制E2E Profile 06 机制E2E Profi…

828华为云征文|部署在线文件管理器 Spacedrive

828华为云征文&#xff5c;部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…

38900 机动车安全检测

参考文章&#xff1a;https://www.zhihu.com/question/458001000 机动车检查 《道路交通安全法实施条例》有关规定第十六条&#xff1a;机动车应当从注册登记之日起&#xff0c;按照下列期限进行安全技术检验&#xff1a; &#xff08;一&#xff09;营运载客汽车5年以内每年…

CSS 圆角渐变边框

<div class"contact-box"><div class"contact-item">联系我们</div> </div>.contact-item{width: 194px;height: 48px;border-radius: 20px 20px 20px 20px;background-color: #000000;color: #BDBDBD;font-weight: 500;font-size…

828华为云征文 | 华为云X实例服务器上部署知识图谱项目的详细指南

前言 知识图谱作为数据整合、语义分析和人工智能的重要基础&#xff0c;逐渐被广泛应用于各类领域。其通过结构化数据和关系映射&#xff0c;帮助用户更好地理解数据背后的意义。要成功构建和部署知识图谱项目&#xff0c;强大的计算资源和高效的存储查询能力至关重要。华为云X…

网易codeWave——新手如何使用多表头Excel导入数据

需求是需要将下面&#xff08;示例&#xff09;的多表头Excel表格&#xff0c;上传到服务器&#xff0c;展示在codeWave的表格组件内&#xff1a; 第一步下载官方插件&#xff1a; 可以先行查看文档再来 第二步&#xff1a; 选择一个上传组件 第三步&#xff0c;编写上传…

(1)LT9211学习笔记

文章目录 前言一、MIPI接口是什么&#xff1f;二、LT9211框图及应用1&#xff0c;作为MIPI发射机&#xff1a;2&#xff0c;作为双端口Lvds发射机3&#xff0c;作为TTL输出4&#xff0c;作为MIPI接收机&#xff1a;5&#xff0c;作为双端口Lvds接收机6&#xff0c;作为TTL输入 …

STM32(十三):通信协议——USART串口协议

通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统。 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发。 TX &#xff08;Transmit exchange&#xff09; 数据发送角 RX &#xff08;Receive ex…