# eVerify
**Repository Path**: codewarning/eVerify
## Basic Information
- **Project Name**: eVerify
- **Description**: 使用springboot aop工具开发的轻量级、易用的简单鉴权框架,使用注解校验用户角色、权限信息
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-10-15
- **Last Updated**: 2022-10-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 使用教程
## 前置要求
该项目代码仅支持`springboot`项目
- 导入`jar`包
- 导入`springboot aop`依赖
```
org.springframework.boot
spring-boot-starter-aop
```
## 编写Service
需要先编写查询用户角色和权限的`service`方法
eg:
```java
@Service
public class UserService {
public List getRoles(String username){
//TODO
}
public List getPermissions(String username){
//TODO
}
}
```
## 编写配置类
```java
import com.zq.service.impl.UserService;
import com.zq.verify.VerifyConfigurer;
import com.zq.aop.VerifyPointCut;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Slf4j
@Configuration
public class VerifyConfig extends VerifyConfigurer {
@Autowired
private UserService userService;
//需要在这里修改成自己项目中的controller方法所在的包路径
private String controllerPath="com.zq.controller";
public List getRoles() {
//TODO
}
@Override
public List getPermissions() {
//TODO
}
@Bean(value = "AuthenticationAop")
public DefaultPointcutAdvisor createDefaultPointcutAdvisor(){
log.info("鉴权配置启动");
VerifyPointCutAdvisorBulider bulider=new VerifyPointCutAdvisorBulider();
bulider.setVerify(this);
bulider.setControllerPath(controllerPath);
return bulider.bulid();
}
}
```
以上代码需要修改的地方:
- 将`controllerPath`字段属性值修改成自己项目中`controller`包路径
- 实现`getRoles`方法,使用`userService`从数据库查询数据,建议配合`ThreadLocal`一起使用
- 实现`getPermissions`方法,使用`userService`从数据库查询数据,建议配合`ThreadLocal`一起使用
## 异常处理
- 当角色校验失败时,抛出`NoSuchRolesException`异常
- 当权限校验失败时,抛出`NoSuchPermissionException`异常
>以上两个注解均继承于`AuthenticationException`异常,可以直接捕获该异常进行处理
eg:
```java
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
//返回值按需修改
@ExceptionHandler(value = {AuthenticationException.class})
public String handleAuthenticationException(AuthenticationException e) {
return e.getMessage();
}
}
```
> `e.getMessage()`的值来自于`CheckRoles`和`CheckPermissions`注解的msg字段默认值,在接口上使用这两个参数的时候,可以自己设置默认值,此时`e.getMessage()`的值为自己设置的
## Controller样例
```java
import com.zq.annotation.CheckPermission;
import com.zq.annotation.CheckRoles;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping(value = "test", method = RequestMethod.GET)
public class TestController {
@CheckRoles("admin")
@CheckPermission("user:add")
@GetMapping(value = "t01")
public String t01() {
return "01";
}
@CheckRoles("admin")
@CheckPermission("user:edit")
@GetMapping(value = "t02")
public String t02() {
return "02";
}
@CheckRoles("admin")
@GetMapping(value = "t03")
public String t03() {
return "03";
}
@CheckRoles("user")
@GetMapping(value = "t04")
public String t04() {
return "04";
}
@CheckPermission("user:add")
@GetMapping(value = "t05")
public String t05() {
return "05";
}
}
```
## 建议
该框架建议配合JWT一起使用,校验流程可以如下:
1.用户成功登录之后返回token
2.用户下次请求时携带token,在JWT过滤器中校验token是否有效
>从token中拿的user信息建议放到Threadlocal里面,下次其他方法需要的时候二次利用
3.eVerify框架在AOP中获取被调用接口方法标注的角色和权限注解,根据从token中计算的username查询数据库,校验是否有角色或者权限,以此判断该用户是否有权限访问该接口
4.若使用JWT框架,请不要在未经过JWT过滤的接口上使用鉴权注解
5.一般来说是从token中拿user信息,在getRoles或getPermissions方法里面用user信息查数据库
# 源码解读与使用
[基于Springboot Aop实现简易注解鉴权式框架](https://blog.csdn.net/qq_16525829/article/details/127344309)