【Spring Security】打造安全无忧的Web应用--进阶篇

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于Spring Security的相关操作吧 

 

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.导入相关配置

1.pom

2.yml依赖

二.SpringSecurity的认证

1.联动数据库的登陆测试

2.BCryptPasswordEncoder密码编码器

3.登录中的"记住我"

4.CSRF防御

①.什么是CSRF

②.SpringSecurity中如何使用CSRF


上篇对于Spring Security已经有了一个大致的讲解,不过上篇没有与数据库进行联动,这一篇我们的主要目的就是将Spring Security与数据库进行联动

一.导入相关配置

1.pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.WH</groupId>
    <artifactId>security</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>security</name>
    <description>Demo project for Spring Boot</description>
    <properties>
       <!-- <java.version>17</java.version>-->
    </properties>
    <dependencies>
        <dependency>
        <!--mysql-->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.44</version>
        </dependency>
        <!--mybatisplus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!-- freemarker -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <!--security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!--springmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--security-test-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.yml依赖

spring:
  freemarker:
    # 设置freemarker模板后缀
    suffix: .ftl
    # 设置freemarker模板前缀
    template-loader-path: classpath:/templates/
    enabled: true
server:
  port: 8080
  #mybatis配置
  mybatis:
    #配置SQL映射文件路径
    mapper-locations: classpath:mapper/*.xml
    #配置别名
    type-aliases-package: com.wh.security.model
  #pagehelper分页插件配置
  pagehelper:spring:
    freemarker:
      # 设置模板后缀名
      suffix: .ftl
      # 设置文档类型
      content-type: text/html
      # 设置页面编码格式
      charset: UTF-8
      # 设置页面缓存
      cache: false
      # 设置ftl文件路径
      template-loader-path: classpath:/templates
      # 设置静态文件路径,js,css等
      mvc:
        static-path-pattern: /static/**
    datasource:
      driver-class-name: com.mysql.jdbc.Driver
      type: com.zaxxer.hikari.HikariDataSource
      url: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
      username: root
      password: 123456
      druid:
        #2.连接池配置
        #初始化连接池的连接数量 大小,最小,最大
        initial-size: 5
        min-idle: 5
        max-active: 20
        #配置获取连接等待超时的时间
        max-wait: 60000
        #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        time-between-eviction-runs-millis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        min-evictable-idle-time-millis: 30000
        validation-query: SELECT 1 FROM DUAL
        test-while-idle: true
        test-on-borrow: true
        test-on-return: false
        # 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filter:
          stat:
            merge-sql: true
            slow-sql-millis: 5000
        #3.基础监控配置
        web-stat-filter:
          enabled: true
          url-pattern: /*
          #设置不统计哪些URL
          exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
          session-stat-enable: true
          session-stat-max-count: 100
        stat-view-servlet:
          enabled: true
          url-pattern: /druid/*
          reset-enable: true
          #设置监控页面的登录名和密码
          login-username: admin
          login-password: admin
          allow: 127.0.0.1
          #deny: 192.168.1.100
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql
  #log日志配置
  logging:
    level:
      #指定项目目录输入日志信息
      com.wh.springboot.mapper: debug
  #自定义stater
  weblog:
    enabled: false
  #mybatis-plus的配置
  mybatis-plus:
    # Mybatis Mapper所对应的XML位置
    mapper-locations: classpath:mapper/*.xml
    # 别名包扫描路径
    type-aliases-package: com.wh.security.model
    # 是否开启自动驼峰命名规则(camel case)映射
    configuration:
      map-underscore-to-camel-case: true
    global-config:
      db-config:
        logic-delete-field: deleted # 全局逻辑删除的实体字段名
        logic-delete-value: 1       # 逻辑已删除值(默认为 1)
        logic-not-delete-value: 0   # 逻辑未删除值(默认为 0)

二.SpringSecurity的认证

1.联动数据库的登陆测试

现在只有数据库中的用户才可以登录进去了,我们现在拿admin试一下

不是这个数据库中存在的用户就不能够登录进去了

2.BCryptPasswordEncoder密码编码器

市面上有一种加密的技术--MD5,但是它也存在许多的弊端:

  1. 容易碰撞:MD5算法存在碰撞的概率,即两个不同的输入可能会生成相同的哈希值。这使得攻击者有可能通过构造具有相同MD5哈希值的不同输入来欺骗系统。

  2. 不可逆性:MD5是一个单向散列函数,无法从哈希值反推出原始数据。这在某些情况下可能是优点,但也限制了其在某些应用中的安全性。

  3. 安全性较低:由于技术的发展和计算资源的增强,如今使用暴力破解或字典攻击等方法,可以相对容易地破解MD5哈希值,尤其是对于简单的密码或常见的输入。

  4. 长度固定:MD5生成的哈希值长度为128位(32个十六进制字符),这在某些情况下可能不足以提供足够的安全性。

所以我们最好也不要去使用MD5进行加密

   BCryptPasswordEncoderSpring Security中一种基于bcrypt算法的密码加密方式。bcrypt算法是一种密码哈希函数,具有防止彩虹表攻击的优点,因此安全性较高。

        使用BCryptPasswordEncoder进行密码加密时,可以指定一个随机生成的salt值,将其与原始密码一起进行哈希计算。salt值可以增加密码的安全性,因为即使两个用户使用相同的密码,由于使用不同的salt值进行哈希计算,得到的哈希值也是不同的。

        在Spring Security中,可以通过在SecurityConfig配置类中添加以下代码来使用

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

这样就可以在Spring Security中使用BCryptPasswordEncoder进行密码加密了。

如果我们在一个类中有两个一个的方法,我们想要默认引入的是a方法,那么就可以在那个方法中加一个@primary的注解

3.登录中的"记住我"

在我没有点击记住我的时候,浏览器中的cookie只有一个默认的tomcat的cookie,但是当我点击记住我之后,就马上看到了这个记住我的cookie

我们完成这个功能的话,需要有一张相应的表,用于存储自动登录信息(当然了,这个一般是交于`SpringSecurity`自动生成的)

CREATE TABLE `persistent_logins` (
  `username` varchar(64) NOT NULL,
  `series` varchar(64) PRIMARY KEY,
  `token` varchar(64) NOT NULL,
  `last_used` timestamp NOT NULL
);

我们还需要配置持久化Token方式

/**
     * 配置持久化Token方式,注意tokenRepository.setCreateTableOnStartup()配置
     */
    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        // 设置为true要保障数据库该表不存在,不然会报异常哦
        // 所以第二次打开服务器应用程序的时候得把它设为false
        tokenRepository.setCreateTableOnStartup(false);
        return tokenRepository;
    }

freemarker的编写

<form action="/user/userLogin" method="post">
    <label>账号:</label><input type="text" name="username"/><br/>
    <label>密码:</label><input type="password" name="password"/><br/>
    <input type="checkbox" name="remember-me"/>记住我<br/>
    <input type="submit" value="登 录"/>
</form>

以及WebSecurityConfig中的配置

                .and()
                .rememberMe()
                .tokenValiditySeconds(300)
                .rememberMeCookieName("remember-me-cookie")

4.CSRF防御

①.什么是CSRF

        `CSRF`(`Cross-Site Request Forgery`,跨站请求伪造)是一种利用用户已登录的身份在用户不知情的情况下发送恶意请求的攻击方式。攻击者可以通过构造恶意链接或者伪造表单提交等方式,让用户在不知情的情况下执行某些操作,例如修改密码、转账、发表评论等。

        为了防范`CSRF`攻击,常见的做法是在请求中添加一个`CSRF Token`(也叫做同步令牌、防伪标志),并在服务器端进行验证。`CSRF Token`是一个随机生成的字符串,每次请求都会随着请求一起发送到服务器端,服务器端会对这个`Token`进行验证,如果`Token`不正确,则拒绝执行请求。

②.SpringSecurity中如何使用CSRF

Spring Security中,防范CSRF攻击可以通过启用CSRF保护来实现。启用CSRF保护后,Spring Security会自动在每个表单中添加一个隐藏的CSRF Token字段

 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

并在服务器端进行验证。如果Token验证失败,则会抛出异常,从而拒绝执行请求。启用CSRF保护的方式是在Spring Security配置文件中添加.csrf()方法,例如:

http.csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

在上面的配置中,我们使用了CookieCsrfTokenRepository作为CSRF Token的存储方式,并设置了httpOnlyfalse,以便在客户端可以访问到该Token

.csrf()主要方法介绍:

方法说明
disable()关闭CSRF防御
csrfTokenRepository()设置CookieCsrfTokenRepository实例,用于存储和检索CSRF令牌。与HttpSessionCsrfTokenRepository不同,CookieCsrfTokenRepositoryCSRF令牌存储在cookie中,而不是在会话中。
ignoringAntMatchers()设置一组Ant模式,用于忽略某些请求的CSRF保护。例如,如果您想要忽略所有以/api/开头的请求,可以使用.ignoringAntMatchers("/api/**")
csrfTokenManager()设置CsrfTokenManager实例,用于管理CSRF令牌的生成和验证。默认情况下,Spring Security使用DefaultCsrfTokenManager实例来生成和验证CSRF令牌。
requireCsrfProtectionMatcher()设置RequestMatcher实例,用于确定哪些请求需要进行CSRF保护。默认情况下,Spring Security将对所有非GET、HEAD、OPTIONS和TRACE请求进行CSRF保护。

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis基本用法学习(C#调用NRedisStack操作redis)

redis官网文档中推荐C#中使用NRedisStack包连接并操作redis&#xff0c;本文学习C#调用NRedisStack操作redis的基本方式。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装NRedisStack包&#xff0c;如下图所示&#xff1a; 主要调用StackExchange.Redis命名空间下…

Navicat里放大、缩小字体的快捷方法

我是偶然误触键盘把字体缩小了&#xff0c;研究以后发现的这个快捷键&#xff0c;分享给大家。 方法&#xff1a;按住【CtrlShift】组合键&#xff0c;再拖动鼠标滚轮&#xff0c;就可以缩放字体了。 缩小效果&#xff1a; 放大效果&#xff1a;

看懂PL/SQL执行计划

看懂PL/SQL执行计划 一&#xff1a;什么是Oracle执行计划&#xff1f; 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二&#xff1a;怎样查看Oracle执行计划&#xff1f; 因为我一直用的PLSQL远程连接的公司数据库&#xff0c;所以这里以PLSQL为例&#xff1…

第4章Netty第二节入门案例+channel,future,promise介绍

需求 开发一个简单的服务器端和客户端 客户端向服务器端发送 hello, world服务器仅接收&#xff0c;不返回 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.39.Final</version> </d…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

通杀无限 debugger,目前只有 1% 的人知道!

前言 相信很多小伙伴在进行 web 逆向的时候&#xff0c;都遇到过无限 debugger。最简单的方法&#xff0c;在 debugger 位置&#xff0c;点击行号&#xff0c;右键 Never pause here&#xff0c;永远不在此处断下即可。但是这种方法就妄想通杀&#xff0c;显然是不大可能的&am…

电子科技大学《高级算法设计与分析》期末复习汇总

&#x1f389; 博主相信&#xff1a; 有足够的积累&#xff0c;并且一直在路上&#xff0c;就有无限的可能&#xff01;&#xff01;&#xff01; &#x1f468;‍&#x1f393;个人主页&#xff1a; 青年有志的博客 &#x1f4af; 说明&#xff1a; 本文中前大部分来自简言之大…

Ubuntu 常用命令之 sudo 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 sudo命令在Ubuntu系统中是一个非常重要的命令&#xff0c;它允许系统管理员赋予某些用户&#xff08;或用户组&#xff09;以系统管理员的身份运行一些或全部的命令。sudo代表“superuser do”&#xff0c;即以超级用户的身份执行…

SQL Server 安装教程

安装数据库 1、启动SQL Server2014安装程序&#xff0c;运行setup.exe文件&#xff0c;打开”SQL Server安装中心“对话框&#xff0c;单击左侧 的导航区域中的”安装“选项卡。 2、选择”全新SQL Server独立安装或向现有安装添加功能“&#xff0c;启动SQL Server2014安装向导…

【虹科分享】使用Allegro网络万用表进行网络分析

文章速览&#xff1a; Allegro网络万用表在公用事业公司的应用领域Allegro网络万用表 VS. WiresharkAllegro 200和Allegro 500&#xff1a;作为标准配置 传统企业成为互联网服务提供商&#xff0c;如何利用数字工具实现现代化转型&#xff1f;本期文章&#xff0c;我们分享一家…

C++初阶-模板进阶

模板进阶 一、非类型模板参数1.1 引出1.2 非类型模板参数 二、array类2.1 array类的介绍与价值2.2 array的特性2.2.1 array和vector的区别2.2.2 大小不一样2.2.3 array与vector的区别2.2.4 总结 三、模板的特化3.1 概念3.2 函数模板的特化3.3 类模板的特化3.3.1 全特化3.3.2 偏…

ansible远程操作主机功能(2)

command模块 一般用于执行Linux的命令&#xff0c;不支持管道符和重定向。 2&#xff0c;shell模块相当于command的升级版&#xff0c;也可以执行Linux命令。支持管道符和重定向 3&#xff0c;Cron在远程主机生成定时任务 分 时 日 月 周 Minute hour day month …

搅拌站智能上料系统,无人值守,均匀布撒!

搅拌站中的骨料上料系统&#xff0c;遇上最新的人工智能技术&#xff0c;会碰撞出怎样的新发展和新突破&#xff1f;今天和砼行们分享一个现场案例&#xff0c;这是思伟软件在某数字化搅拌站中的应用。 上料无人值守 后场上料配合无人地磅系统&#xff0c;仅需1名操作员在控制…

上市十年 这家互联网服务平台窥见汽车市场“沧海桑田”

十年&#xff0c;对于一家上市公司而言意味着什么&#xff1f;以中概股为例&#xff0c;十年里的高低起伏&#xff0c;折射出不同公司和行业的各异命运。 新浪在2021年私有化退市&#xff0c;曾经名声在外的聚美优品在2020年遭遇同样命运。再往前数&#xff0c;还有离开美股回…

985等高校急速开设“鸿蒙班”,引领IT就业新时代

​根据澎湃新闻记者了解到&#xff0c;华为以及鸿蒙系软件厂商都在积极培养鸿蒙开发人才。其中产学联动、产教融合来培养鸿蒙生态人才是重要的一条路径&#xff0c;目前已有 23 家 985 高校、46 家 211 高校已开设或即将开设HarmonyOS 相关课程。 其中南京大学已经将 HarmonyOS…

版本化数据库管理工具Flyway介绍和Spring Boot集成使用

文章目录 核心功能如何使用 Flyway最佳实践Spring Boot使用 Flyway 是一个版本化数据库管理工具&#xff0c;用于跟踪、管理和应用数据库的变化。它非常适合在团队开发环境中使用&#xff0c;其中多个人员可能会在数据库结构进行更改。Flyway 通过版本控制可以帮助你确保所有人…

使用MyBatis操作数据库及单元测试

目录 一.MyBatis介绍 二.MyBatis操作数据库步骤 三.单元测试 idea上生成测试 配置mybatis日志 动态参数 一.MyBatis介绍 MyBatis是⼀款优秀的持久层框架&#xff0c;⽤于简化JDBC的开发。 JDBC来操作数据库太复杂了,使用MyBatis 是因为它可以帮助我们更⽅便、更快速的操作…

判断单链表是否有环?中点如何判断?入环点如何判断?

首先我们需要克服我们一种错误的认知&#xff0c;链表有环&#xff0c;并不是有“死节”&#xff0c;如下所示&#xff0c;左侧的这种链表结构是不存在的&#xff0c;因为在相交的那个节点不可能有两个指针&#xff0c;只有像右侧这种结构才是存在的 判断链表是否有环的方法&am…

AI代码翻译神器,用AI翻译代码,轻松学习不同编程语言,已开源!

体验地址&#xff0c;github地址和部署地址在文章底部 AI代码翻译器的优势 近年来&#xff0c;随着技术的快速进步&#xff0c;人工智能技术展现出了在各个领域发挥作用的巨大潜力。AI代码翻译器作为一项创新技术&#xff0c;为开发者带来了全新的可能性。这项技术运用人工智…

Slurm随手记

写在前面&#xff1a;项目要用&#xff0c;随便记录一下 文章目录 简介快速开始框架命令建议MPI 参考资料&#xff1a; https://slurm.schedmd.com/quickstart.html https://blog.csdn.net/weixin_42279314/article/details/109677459 https://hpc.pku.edu.cn/_book/guide/slu…