---
icon: simple-icons:spring
title: SpringSecurity
date: 2025-05-07
category:
- JAVA
tag:
- Spring
- SpringSecurity
star: 10
description: 若依的SpringSecurity案例
# 此页面会在文章列表置顶
sticky: true
---
若依的SpringSecurity案例
# 一、准备
## 1. 导入依赖
### 1. 父依赖
```xml
4.0.0
01-druid
02-SpringSecurity
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
com.mangmang
learn-test
0.0.1-SNAPSHOT
learn-test
pom
依赖版本控制
1.8
3.4.3.1
3.4.1
2.3
1.2.4
0.9.1
2.0.8
1.21
1.5.1-RELEASE
eu.bitwalker
UserAgentUtils
${userAgentUtils.version}
com.github.xiaoymin
knife4j-spring-boot-starter
${knife4j.version}
io.jsonwebtoken
jjwt
${jjwt.version}
com.github.jeffreyning
mybatisplus-plus
${mybatisplus-plus.version}
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus.version}
com.baomidou
mybatis-plus-generator
${mybatis-plus-generator.version}
org.apache.velocity
velocity-engine-core
${mybatis-velocity.version}
com.alibaba
druid-spring-boot-starter
${druid.version}
com.alibaba
fastjson
1.2.75
cn.hutool
hutool-all
5.5.8
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
2.3.0.RELEASE
org.projectlombok
lombok
```
### 2. 模块使用依赖
```xml
learn-test
com.mangmang
0.0.1-SNAPSHOT
4.0.0
02-SpringSecurity
8
8
com.github.jeffreyning
mybatisplus-plus
eu.bitwalker
UserAgentUtils
com.github.xiaoymin
knife4j-spring-boot-starter
io.jsonwebtoken
jjwt
org.springframework.boot
spring-boot-starter-security
com.baomidou
mybatis-plus-boot-starter
com.baomidou
mybatis-plus-generator
org.apache.velocity
velocity-engine-core
com.alibaba
druid-spring-boot-starter
src/main/java
**/*.xml
false
```
## 2. 配置YML
### 1. application.yml
```yml
spring:
profiles:
active: local
server:
port: 8000
swagger:
enabled: true
pathMapping:
token:
header: token
secret: asdaswqesdzxwr3123
expire-time: 30
```
### 2. application-local.yml
```yml
spring:
datasource:
# 配置项目数据源为druid
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
url: jdbc:mysql://127.0.0.1:3306/book?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
initial-size: 5
# 最小连接池数量
min-idle: 10
# 最大连接池数量
max-active: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
max-evictable-idle-time-millis: 900000
# 配置检测连接是否有效
validation-query: SELECT 1 FROM DUAL
# 官方推荐配置
test-while-idle: true
test-on-borrow: false
test-on-return: false
#监控配置
web-stat-filter:
# 是否启用StatFilter默认值true
enabled: true
stat-view-servlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: root
login-password: liujing
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
redis:
port: 6379
host: 127.0.0.1
# MyBatis Plus配置
mybatis-plus:
# 搜索指定包别名
typeAliasesPackage: com.mangmang.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
configuration:
# SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
#开启二级缓存
cache-enabled: true
#配置默认的执行器
default-executor-type: reuse
# 开启驼峰命名
map-underscore-to-camel-case: true
# 允许 JDBC 支持自动生成主键
use-generated-keys: true
#关闭logo
global-config:
banner: false
db-config:
# 全局逻辑删除的实体字段名
logic-delete-field: isDeleted
# 逻辑已删除值(默认为 1)
logic-delete-value: 1
# 逻辑未删除值(默认为 0)
logic-not-delete-value: 0
```
## 3. 配置Mybatis-Plus
```java
/**
* @Date: 2021-08-10-17:31
* @Author lj
*/
@Configuration
@EnableTransactionManagement
@MapperScan("com.mangmang.security.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 阻断插件
interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置数据库类型为mysql
paginationInnerInterceptor.setDbType(DbType.MYSQL);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}
/**
* 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
*/
public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
return new BlockAttackInnerInterceptor();
}
}
```
## 4. 配置Knife4j
```java
/**
* @Date: 2021-08-10-18:14
* @Author lj
*/
@EnableSwagger2WebMvc
@Configuration
@EnableKnife4j
public class SwaggerConfig {
/**
* 是否开启swagger
*/
@Value("${swagger.enabled}")
private boolean enabled;
/**
* 设置请求的统一前缀
*/
@Value("${swagger.pathMapping}")
private String pathMapping;
/**
* 创建API
* .pathMapping("test")设置访问路径统一前缀
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
// 是否启用Swagger
.enable(enabled)
// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api,用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build()
/* 设置安全模式,swagger可以设置访问token */
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(pathMapping);
}
/**
* 安全模式,这里指定token通过Authorization头请求头传递
*/
private List securitySchemes() {
List apiKeyList = new ArrayList<>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeyList;
}
/**
* 安全上下文
*/
private List securityContexts() {
List securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$"))
.build());
return securityContexts;
}
/**
* 默认的安全上引用
*/
private List defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo() {
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:后端接口")
// 描述
.description("描述:测试")
// 作者信息
.contact(new Contact("氓氓编程", null, null))
// 版本
.version("版本号:" + "0.0.1")
.build();
}
}
```
## 5. 配置RedisTemplate序列化规则
```java
/**
* @author a3621
*/
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
// 创建一个模板
RedisTemplate template = new RedisTemplate<>();
//创建一个字符串序列化器
RedisSerializer redisSerializer = new StringRedisSerializer();
//创建Jackson 序列化器
Jackson2JsonRedisSerializer