# spring-boot-demo-rbac-security
> 此 demo 主要演示了 Spring Boot 项目如何集成 Spring Security 完成权限拦截操作。本 demo 为基于**前后端分离**的后端权限管理部分,不同于其他博客里使用的模板技术,希望对大家有所帮助。
## 1. 主要功能
- [x] 基于 `RBAC` 权限模型设计,详情参考数据库表结构设计 [`security.sql`](./sql/security.sql)
- [x] 支持**动态权限管理**,详情参考 [`RbacAuthorityService.java`](./src/main/java/com/xkcoding/rbac/security/config/RbacAuthorityService.java)
- [x] **登录 / 登出**部分均使用自定义 Controller 实现,未使用 `Spring Security` 内部默认的实现,适用于前后端分离项目,详情参考 [`SecurityConfig.java`](./src/main/java/com/xkcoding/rbac/security/config/SecurityConfig.java) 和 [`AuthController.java`](./src/main/java/com/xkcoding/rbac/security/controller/AuthController.java)
- [x] 持久化技术使用 `spring-data-jpa` 完成
- [x] 使用 `JWT` 实现安全验证,同时引入 `Redis` 解决 `JWT` 无法手动设置过期的弊端,并且保证同一用户在同一时间仅支持同一设备登录,不同设备登录会将,详情参考 [`JwtUtil.java`](./src/main/java/com/xkcoding/rbac/security/util/JwtUtil.java)
- [x] 在线人数统计,详情参考 [`MonitorService.java`](./src/main/java/com/xkcoding/rbac/security/service/MonitorService.java) 和 [`RedisUtil.java`](./src/main/java/com/xkcoding/rbac/security/util/RedisUtil.java)
- [x] 手动踢出用户,详情参考 [`MonitorService.java`](./src/main/java/com/xkcoding/rbac/security/service/MonitorService.java)
- [x] 自定义配置不需要进行拦截的请求,详情参考 [`CustomConfig.java`](./src/main/java/com/xkcoding/rbac/security/config/CustomConfig.java) 和 [`application.yml`](./src/main/resources/application.yml)
## 2. 运行
### 2.1. 环境
1. JDK 1.8 以上
2. Maven 3.5 以上
3. Mysql 5.7 以上
4. Redis
### 2.2. 运行方式
1. 新建一个名为 `spring-boot-demo` 的数据库,字符集设置为 `utf-8`,如果数据库名不是 `spring-boot-demo` 需要在 `application.yml` 中修改 `spring.datasource.url`
2. 使用 [`security.sql`](./sql/security.sql) 这个 SQL 文件,创建数据库表和初始化RBAC数据
3. 运行 `SpringBootDemoRbacSecurityApplication`
4. 管理员账号:admin/123456 普通用户:user/123456
5. 使用 `POST` 请求访问 `/${contextPath}/api/auth/login` 端点,输入账号密码,登陆成功之后返回token,将获得的 token 放在具体请求的 Header 里,key 固定是 `Authorization` ,value 前缀为 `Bearer 后面加空格`再加token,并加上具体请求的参数,就可以了
6. enjoy ~ :kissing_smiling_eyes:
## 3. 部分关键代码
### 3.1. pom.xml
```xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot-demo-rbac-security</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-demo-rbac-security</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.xkcoding</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<jjwt.veersion>0.9.1</jjwt.veersion>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 对象池,使用redis时必须引入 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.veersion}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-demo-rbac-security</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
```
### 3.2. JwtUtil.java
> JWT 工具类,主要功能:生成JWT并存入Redis、解析JWT并校验其准确性、从Request的Header中获取JWT
```java
/**
* <p>
* JWT 工具类
* </p>
*
* @package: com.xkcoding.rbac.security.util
* @description: JWT 工具类
* @author: yangkai.shen
* @date: Created in 2018-12-07 13:42
* @copyright: Copyright (c) 2018
* @version: V1.0
* @modified: yangkai.shen
*/
@EnableConfigurationProperties(JwtConfig.class)
@Configuration
@Slf4j
public class JwtUtil {
@Autowired
private JwtConfig jwtConfig;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 创建JWT
*
* @param rememberMe 记住我
* @param id 用户id
* @param subject 用户名
* @param roles 用户角色
* @param authorities 用户权限
* @return JWT
*/
public String createJWT(Boolean rememberMe, Long id, String subject, List<String> roles, Collection<? extends GrantedAuthority> authorities) {
Date now = new Date();
JwtBuilder builder = Jwts.builder()
.setId(id.toString())
.setSubject(subject)
.setIssuedAt(now)
.signWith(SignatureAlgorithm.HS256, jwtConfig.getKey())
.claim("roles", roles)
.claim("authorities", authorities);
// 设置过期时间
Long ttl = rememberMe ? jwtConfig.getRemember() : jwtConfig.getTtl();
if (ttl > 0) {
builder.setExpiration(DateUtil.offsetMillisecond(now, ttl.intValue()));
}
String jwt = builder.compact();
// 将生成的JWT保存至Redis
stringRedisTemplate.opsForValue()
.set(Consts.REDIS_JWT_KEY_PREFIX + subject, jwt, ttl, TimeUnit.MILLISECONDS);
return jwt;
}
/**
* 创建JWT
*
* @param authentication 用户认证信息
* @param rememberMe 记住我
* @return JWT
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
java 所有技术点源码学习大集合 kafka mq redis es boot cloud task mybatis shiro Handler dubbo docker async swagger thymeleaf websocket task-quartz mybatis-plus jpa oauth aop https mongodb graylog flyway datasource neo4j rocketmq session social template-freemarker upload security rabbitmq 线程 等等一大堆打包学习源码,需要面试和提升自己的可以下载,直接运行即可 技术点超级多呀欢迎大家下载学习!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
资源详情
资源评论
资源推荐
收起资源包目录
java 所有技术点源码学习大集合 kafka mq redis es boot cloud task 等等学习源码 (1680个子文件)
README.adoc 8KB
README.adoc 1KB
team01.bpmn 4KB
login.btl 373B
index.btl 171B
PersonRepositoryTest.class 30KB
RabbitMqConfig.class 8KB
SpringBootDemoZookeeperApplicationTests.class 6KB
KafkaTest.class 5KB
KafkaTest.class 5KB
ZooLockAspect.class 5KB
ESDlcjqDTO.class 5KB
ESSdcjqDTO.class 5KB
ESZnjgDTO.class 5KB
ESWhpkkDTO.class 5KB
ESQxzDTO.class 5KB
ESTgkzqDTO.class 5KB
ESLampDTO.class 5KB
ESCoviDTO.class 5KB
ESFsfsDTO.class 5KB
ESZdyDTO.class 5KB
UploadController.class 5KB
CleanUpScheduler.class 5KB
ProactiveGcTask.class 5KB
ApiResponse.class 4KB
Person.class 4KB
SpringBootDemoMqRabbitmqApplicationTests.class 4KB
MailServiceImpl.class 4KB
RedisTest.class 4KB
RedisConfig.class 4KB
MailServiceTest.class 4KB
SendMessageController.class 4KB
MyAckReceiver.class 3KB
DeveloperProperty.class 3KB
DeveloperProperty.class 3KB
UploadConfig.class 3KB
Sender.class 3KB
DirectQueueOneHandler.class 2KB
Receiver.class 2KB
QiNiuServiceImpl.class 2KB
UserServiceImpl.class 2KB
BaseException.class 2KB
DelayQueueHandler.class 2KB
QueueThreeHandler.class 2KB
DemoExceptionHandler.class 2KB
QueueTwoHandler.class 2KB
User.class 2KB
ZkProps.class 2KB
ApplicationProperty.class 2KB
ApplicationProperty.class 2KB
TopicRabbitConfig.class 2KB
RabbitConfig$2.class 2KB
DirectRabbitConfig.class 2KB
FanoutRabbitConfig.class 2KB
ApiCallRecord.class 2KB
MessageStruct.class 2KB
UserController.class 2KB
UserServiceTest.class 2KB
MyConsumer.class 2KB
User.class 2KB
IndexController.class 2KB
RabbitConfig$1.class 2KB
MessageListenerConfig.class 2KB
RabbitConfig.class 2KB
Status.class 2KB
ZkDemo.class 2KB
ZkConfig.class 2KB
SpringBootDemoHelloworldApplication.class 1KB
TestApplication.class 1KB
PasswordTest.class 1KB
TemplateTest.class 1KB
PropertyController.class 1KB
PropertyController.class 1KB
TestController.class 1KB
MessageStruct$MessageStructBuilder.class 1KB
TopicTotalReceiver2.class 1KB
TopicTotalReceiver.class 1KB
TopicManReceiver.class 1KB
DirectReceiver.class 1KB
ElasticSearchConfiguration.class 947B
EsConsts.class 917B
SpringBootDemoMqKafkaApplicationTests.class 874B
AdminServerApplication.class 867B
SpringBootDemoAdminServerApplication.class 850B
SpringBootDemoTemplateFreemarkerApplication.class 819B
SpringBootDemoExceptionHandlerApplication.class 809B
SpringBootDemoElasticsearchApplication.class 792B
SpringBootDemoAdminClientApplication.class 784B
SpringBootDemoMqRabbitmqApplication.class 779B
SpringBootDemoCacheRedisApplication.class 779B
SpringBootDemoPropertiesApplication.class 777B
SpringBootDemoZookeeperApplication.class 772B
SpringBootDemoActuatorApplication.class 767B
SpringBootDemoMqKafkaApplication.class 764B
SpringBootDemoUploadApplication.class 757B
SpringBootDemoEmailApplication.class 752B
SpringBootDemoTemplateFreemarkerApplicationTests.class 738B
SpringBootDemoExceptionHandlerApplicationTests.class 728B
SpringBootDemoElasticsearchApplicationTests.class 711B
JsonException.class 707B
共 1680 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
yangsiming123456
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 毕设和企业适用springboot自动化仓库管理平台类及云计算资源管理平台源码+论文+视频.zip
- 毕设和企业适用springboot自动化仓库管理平台类及直播流媒体平台源码+论文+视频.zip
- 360图床HTML源码.zip
- 毕设和企业适用springboot订餐类及虚拟人类交互系统源码+论文+视频.zip
- 毕设和企业适用springboot二手跳蚤类及共享经济平台源码+论文+视频.zip
- 2023年总结,个人资料
- 2024年下半年计算机水平考试模拟盘.zip
- A10-Tray自动上料抓取工位工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- MySQL基础-布尔全文搜索.pdf
- ANQU磁铁检测机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- AS014-XD10检测设备装配体工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 2023工作总结,个人使用
- 1212338883_2402103_10.2.1.1_20241216090042_951322129_a.apk
- 圣诞树html网页代码
- Linux应急响应手册
- 555构成的多路波形发生器.ms14
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0