# 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)