# smart-auth-util
**Repository Path**: swayingleavescn/smart-auth-util
## Basic Information
- **Project Name**: smart-auth-util
- **Description**: https://github.com/Swayingleaves/smart-auth-util
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-11
- **Last Updated**: 2021-03-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
权限认证工具
# 注意事项
* 配置本地maven 以适配私服,或者修改为自己的私服配置
* pom引入依赖
```xml
com.swayingleaves
smart-auth-util
${latest-version}
```
* 要使用auth-util,使用的项目需要的Redis配置相同
* 实现强依赖Redis,请配置Redis相关
```yaml
spring:
redis:
host: 127.0.0.1
port: 6379
database: xx
password: xxxx
```
* 启动类添加扫描包注解
```java
@ComponentScan(basePackages = {"com.swayingleaves"})
```
* 不一定能适用于大家的项目,但是看下实现逻辑就好
# 使用说明
* 基于cookie的SSO验证,请求接口时cookie需带上key为SSO_TOKEN的token,例如:
 (SSO_TOKEN的值为登录成功时接口返回的用户token;)
> @CheckLogin 检查登录
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 类、方法 |
| 作用 | 验证请求用户是否登录 |
| 验证级别 | 1 |
```java
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
......//
}
```
> @CheckGroup 检查组
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 类、方法 |
| 作用 | 验证请求用户是否具有组权限 |
| 验证级别 | 1 |
```java
@RequestMapping("/test")
@CheckGroup(group = "auth",opt = AuthOpt.AND)
@RestController
public class TestController {
......//
}
```
> @CheckGroup 检查组
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 类、方法 |
| 作用 | 验证请求用户是否具有组权限 |
| 验证级别 | 1 |
| 注意 | 需controller层使用@CheckLogin注解 |
| 注解参数 | 说明 |
| ---- | ---- |
| String[] group() default {} | 指定组 |
| AuthOpt opt() default AuthOpt.AND | 指定组间关系 默认OR 可选 AuthOpt.AND |
```java
@RequestMapping("/test")
@CheckGroup(group = "auth",opt = AuthOpt.AND)
@RestController
public class TestController {
......//
}
```
> @CheckRole 检查角色
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 方法 |
| 作用 | 验证请求用户是否拥有访问该方法的角色 |
| 验证级别 | 2 |
| 注意 | 需controller层使用@CheckLogin注解 |
| 注解参数 | 说明 |
| ---- | ---- |
| String[] roles() default {} | 指定角色 |
| AuthOpt opt() default AuthOpt.AND | 指定关系 默认OR 可选 AuthOpt.AND |
```java
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
@GetMapping("/queryMsg")
@CheckRole(roles = {"admin","emp"},opt = AuthOpt.AND)
public String queryMsg(){
return "msg";
}
@GetMapping("/delMsg")
@CheckRole(roles = {"admin","master"},opt = AuthOpt.OR)
public String delMsg(){
return "del";
}
}
```
> @CheckPermission 检查权限
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 方法 |
| 作用 | 验证请求用户是否拥有访问该方法的权限 |
| 验证级别 | 3 |
| 注意 | 需controller层使用@CheckLogin注解 |
| 注解参数 | 说明 |
| ---- | ---- |
| String[] permissions() default {} | 指定权限 |
| AuthOpt opt() default AuthOpt.AND | 指定关系 默认OR 可选 AuthOpt.AND |
```java
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
@GetMapping("/queryMsg")
@CheckPermission(permissions = {"admin:query","master:add"},opt=AuthOpt.OR)
public String queryMsg(){
return "msg";
}
@GetMapping("/delMsg")
@CheckPermission(permissions = {"admin:del","master:del"},opt = AuthOpt.AND)
public String delMsg(){
return "del";
}
}
}
```
> @Limit 限流
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 方法 |
| 作用 | 限制访问频率 |
| 注解参数 | 说明 |
| ---- | ---- |
| int rate() default 1000; | 速率 如限制1000次 |
| String methodType() default "M"; | 方法类型 |
| TimeUnit timeUnit() default TimeUnit.MINUTES; | 时间 如TimeUnit.MINUTES 为分 则限制为 每分钟 1000次访问可选 |
```java
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
@GetMapping("/queryMsg")
@Limit(rate = 10,methodType = "QUERY_MSG",timeUnit = TimeUnit.MINUTES)
public String queryMsg(){
return "msg";
}
@GetMapping("/delMsg")
@Limit(rate = 5,methodType = "DEL_MSG",timeUnit = TimeUnit.HOURS)
public String delMsg(){
return "del";
}
}
```
> @Record 记录请求日志
| 类别 | 说明 |
| ---- | ---- |
| 适用于 | 方法 |
| 作用 | 日志打印 访问方法的 ip,url,method,class,method name,params |
```java
@RequestMapping("/test")
@CheckLogin
@RestController
public class TestController {
@GetMapping("/queryMsg")
@Record
public String queryMsg(){
return "msg";
}
}
```
```java
ip:[0:0:0:0:0:0:0:1],url:[http://localhost:8080/test/queryMsg],method:[GET],class:[com.bxtdata.authtest.controller.TestController],method name:[queryMsg],params:[[]]
```
# 异常说明
* 请自行在controller层捕捉异常并处理
```java
/**
* @author zhenglin
* @since 2019/6/18 11:11
* @apiNote 统一异常处理
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 登录异常
* @param e
* @return
*/
@ExceptionHandler(value = LoginException.class)
public JSONObject exception(LoginException e){
return Result.build(CodeEnum.NOT_LOGGED_IN.code, CodeEnum.NOT_LOGGED_IN.message);
}
/**
* 非法请求
* @param e
* @return
*/
@ExceptionHandler(value = IllegalRequestException.class)
public JSONObject exception(IllegalRequestException e){
return Result.build(CodeEnum.ILLEGAL_REQUESTS.code, CodeEnum.ILLEGAL_REQUESTS.message);
}
/**
* 无权访问
* @param e
* @return
*/
@ExceptionHandler(value = NoAuthorityException.class)
public JSONObject exception(NoAuthorityException e){
return Result.build(CodeEnum.NO_AUTHORITY.code, CodeEnum.NO_AUTHORITY.message,e.getMessage());
}
/**
* 频率限制
* @param e
* @return
*/
@ExceptionHandler(value = LimitException.class)
public JSONObject limitException(LimitException e){
return Result.build(CodeEnum.RATE_LIMIT.code, CodeEnum.RATE_LIMIT.message);
}
}
```