# spring-boot-starter-security
**Repository Path**: antcore/spring-boot-starter-security
## Basic Information
- **Project Name**: spring-boot-starter-security
- **Description**: Spring Boot权限框架,对开发者更友好的分布式权限验证框架,极大的提高验证效率。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 8
- **Forks**: 7
- **Created**: 2021-03-31
- **Last Updated**: 2024-03-18
## Categories & Tags
**Categories**: authority-management, spring-boot-ext
**Tags**: None
## README
# spring-boot-starter-security
#### 项目介绍
Spring Boot权限框架,对开发者更友好的分布式权限验证框架,极大的提高验证效率。
[](https://mvnrepository.com/artifact/cn.antcore/spring-boot-starter-security)
[](https://mvnrepository.com/artifact/cn.antcore/spring-boot-starter-security)
[](https://mvnrepository.com/artifact/cn.antcore/spring-boot-starter-security)
#### 使用教程
进入教程[例子](https://gitee.com/hong_ej/ant-security-example.git)
#### Maven仓库坐标
```xml
cn.antcore
spring-boot-starter-security
${Maven仓库最新版本}
compile
```
#### 基础能力
##### 登录授权
* UserDetails
> 用户数据; 保存用户的唯一id、用户名、已拥有的权限集合和已拥有的角色集合
* LoginSession
> 登录Session; 提供基础的登录能力和退出能力。登录能力调用后会返回用户唯一token标志
* 例子如下:
```java
@PostRest(value = "login", login = false)
public ReturnT login(HttpSession session, String username, String password) {
// TODO 自己实现username和password的登录验证逻辑
UserDetails details = new UserDetails(10010L, "Admin");
details.setAuthority(Arrays.asList("index", "user"));
details.setRoles(Arrays.asList("admin"));
String token = ((LoginSession) session).loginSuccess(details);
return ReturnT.success(token);
}
```
##### 退出登录
* 例子如下:
```java
@GetRest(value = "logout")
public ReturnT logout(HttpSession session) {
session.invalidate();
return ReturnT.success("success");
}
```
```java
@GetRest(value = "logout")
public ReturnT logout(HttpSession session) {
LoginSession loginSession = (LoginSession) session;
loginSession.logout();
return ReturnT.success("success");
}
```
##### 获取登录用户信息
* UserSession
> 用户Session; 提供登录用户的基础信息查询方法,如用户id,用户名,用户数据等
* 例子如下:
```java
@GetRest(authority = {"index"}, roles = "admin", condition = "#session.getUserId() == 10010L")
public ReturnT index(HttpSession session) {
UserSession userSession = (UserSession) session;
return ReturnT.success(userSession.getUserId());
}
```
##### 接口登录验证
* 功能概述
> 为了让一个接口必须登录后才能访问而增加的拦截
* @Login
> 该注解是拦截接口登录权限而产生的; 提供一个value参数,true表示接口需要登录才能访问,false表示接口无需登录即可访问
* 例子如下:
```java
@Login(value = false)
@PostMapping(value = "login")
public ReturnT login(HttpSession session, String username, String password) {
// TODO 登录逻辑
}
```
##### 接口权限、角色和自定义规则拦截验证
* 功能概述
> 一个接口必须由拥有指定权限的用户才能访问
* @ApiAuthorize
> 该注解的作用是校验接口权限、角色访问限制和接口自定义规则拦截; value和authority参数,需要的权限集合。roles参数,需要的角色集合。condition参数,自定义规则,支持SpEL表达式。
* 例子如下:
```java
@ApiAuthorize(authority = {"index"}, roles = "admin", condition = "#session.getUserId() == 10010L")
public ReturnT index(HttpSession session) {
// 此接口表达的意思是:用户需要要拥有index权限才能访问,而且该用户必须是admin角色,最后该用户的userId必须是10010.
// 三个条件是并且的关系
}
```
##### Rest接口增强
* 功能概述
> 将@RequestMapping、@Login和@ApiAuthorize三个注解融合在一个注解当中;为了减少接口上的注解数量。
* 例子如下:
```java
import cn.antcore.security.web.GetRest;
import cn.antcore.security.web.PostRest;
import cn.antcore.security.web.PutRest;
import cn.antcore.security.web.DeleteRest;
import cn.antcore.security.web.OptionsRest;
import cn.antcore.security.web.PatchRest;
import cn.antcore.security.web.HeadRest;
import cn.antcore.security.web.TraceRest;
@GetRest(value = {"", "/index"}, authority = {"index"}, roles = "admin", condition = "#session.getUserId() == 10010L")
public ReturnT index(HttpSession session) {
// TODO 自定义逻辑
}
```
#### 配置文件
```yaml
spring:
security:
session-time: 24h # Token失效时间
automatic-renewal: true # Token是否自动续签
max-live: 1 # 同一个用户最大同时在线数
redis: # Redis配置
host: 127.0.0.1
port: 6379
```
#### 基础扩展能力
##### Token生成 / 读取策略
* 功能概述
> 登录Session返回的Token生成策略以及前端Token传递到后端,后端在什么位置获取到Token等
* 接口和默认实现
> interface: cn.antcore.security.session.SessionIdStrategy
class impl: cn.antcore.security.session.strategy.HeaderSessionIdStrategy
* 默认实现类说明
> Token生成策略是UUID;前端通过Header头传递Token,header头的名字叫做"X-Auth-Token"
* 自定义实现
> 实现SessionIdStrategy接口,并将实现类交给Spring BeanFactory管理即可
##### Session生成策略
* 功能概述
> 分布式Session的生成策略,默认使用Redis作为数据存储仓库
* 接口和默认实现
> interface: cn.antcore.security.session.SessionStrategy
class impl: cn.antcore.security.session.strategy.RedisSessionStrategy
* 默认实现类说明
> Session中的数据保存使用Redis作为存储媒介
* 自定义实现
> 实现SessionStrategy接口,并将实现类交给Spring BeanFactory管理即可
##### Token自动续期管理
* 功能概述
> 服务器一旦监测到Token正在使用,则会自动续期该Token
* 接口和默认实现
> interface: cn.antcore.security.session.refresh.SessionTimeoutRefresh
class impl: cn.antcore.security.session.refresh.RedisSessionTimeoutRefresh
* 默认实现类说明
> SessionIdStrategy类的getSessionId行为会触发Token续期
* 自定义实现
> 实现SessionTimeoutRefresh接口,并将实现类交给Spring BeanFactory管理即可
##### 用户存活数管理
* 功能概述
> 用户一旦创建新的Token,则会触发用户存活数检测,超出最大存活数限制就会剔除旧的会话
* 接口和默认实现
> interface: cn.antcore.security.session.max.MaxSession
class impl: cn.antcore.security.session.max.MaxSessionManager
* 默认实现类说明
> LoginSession类的loginSuccess行为会触发用户存活数管理
* 自定义实现
> 实现MaxSession接口,并将实现类交给Spring BeanFactory管理即可
#### 高级扩展能力
##### 登录状态拦截
* 功能概述
> @Login触发的拦截器
* 接口和默认实现
> interface: cn.antcore.security.filter.LoginStatusFilter
class impl: cn.antcore.security.filter.RedisLoginStatusFilter
* 默认实现类说明
> 拿到UserSession,通过isLogin行为判断用户是否登录
* 自定义实现
> 实现LoginStatusFilter接口,并将实现类交给Spring BeanFactory管理即可
##### 权限拦截器
* 功能概述
> @ApiAuthorize触发的拦截器
* 接口和默认实现
> interface: cn.antcore.security.filter.AuthorizeFilter
class impl: cn.antcore.security.filter.AuthorizeFilterImpl
* 默认实现类说明
> 拿到UserDetails中的权限进行拦截放行
* 自定义实现
> 实现AuthorizeFilter接口,并将实现类交给Spring BeanFactory管理即可