🥳🥳Welcome Huihui's Code World ! !🥳🥳
**接下来看看由辉辉所写的关于Spring Security的相关操作吧 **
上篇对于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,但是它也存在许多的弊端:
- 容易碰撞:MD5算法存在碰撞的概率,即两个不同的输入可能会生成相同的哈希值。这使得攻击者有可能通过构造具有相同MD5哈希值的不同输入来欺骗系统。
- 不可逆性:MD5是一个单向散列函数,无法从哈希值反推出原始数据。这在某些情况下可能是优点,但也限制了其在某些应用中的安全性。
- 安全性较低:由于技术的发展和计算资源的增强,如今使用暴力破解或字典攻击等方法,可以相对容易地破解MD5哈希值,尤其是对于简单的密码或常见的输入。
- 长度固定:MD5生成的哈希值长度为128位(32个十六进制字符),这在某些情况下可能不足以提供足够的安全性。
所以我们最好也不要去使用MD5进行加密
BCryptPasswordEncoder
是
Spring 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
的存储方式,并设置了
httpOnly
为
false
,以便在客户端可以访问到该
Token
。
.csrf()
主要方法介绍:
方法说明disable()
关闭
CSRF
防御
csrfTokenRepository()
设置
CookieCsrfTokenRepository
实例,用于存储和检索
CSRF
令牌。与
HttpSessionCsrfTokenRepository
不同,
CookieCsrfTokenRepository
将
CSRF
令牌存储在
cookie
中,而不是在会话中。
ignoringAntMatchers()
设置一组Ant模式,用于忽略某些请求的
CSRF
保护。例如,如果您想要忽略所有以
/api/
开头的请求,可以使用
.ignoringAntMatchers("/api/**")
。
csrfTokenManager()
设置
CsrfTokenManager
实例,用于管理
CSRF
令牌的生成和验证。默认情况下,
Spring Security
使用
DefaultCsrfTokenManager
实例来生成和验证
CSRF
令牌。
requireCsrfProtectionMatcher()
设置
RequestMatcher
实例,用于确定哪些请求需要进行
CSRF
保护。默认情况下,
Spring Security
将对所有非
GET、HEAD、OPTIONS和TRACE
请求进行
CSRF
保护。
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊
版权归原作者 是辉辉啦 所有, 如有侵权,请联系我们删除。