1.2 使用JAVA自定义注解实现简单的自定义权限验证

前沿

权限认证是一个常见的需求,用自定义注解可以很简单的实现权限的验证。废话不多说,直接讲解。

自定义注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleNum {
    //默认0为一般用户,1为普通管理员,2为超级管理员
    RoleEnum role();
}

用一个枚举类存放管理权限信息

可根据个人需求不同进行改变。

@Getter
public enum RoleEnum {
    USER(0, "普通用户"),
    ADMIN(1, "普通管理员"),
    SUPPER_ADMIN(2, "系统管理员"),
    ;


    private Integer value;
    private String role;

    RoleEnum(Integer value, String role) {
        this.value = value;
        this.role = role;
    }

    public static String getRole(Integer integer) {
        HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(SUPPER_ADMIN.getValue(), SUPPER_ADMIN.getRole());
        hashMap.put(ADMIN.getValue(), ADMIN.getRole());
        hashMap.put(USER.getValue(), USER.getRole());
        return hashMap.get(integer);
    }

    public static Integer getValue(String role) {
        HashMap<String, Integer> hashMap = new HashMap<>();
        hashMap.put(SUPPER_ADMIN.getRole(), SUPPER_ADMIN.getValue());
        hashMap.put(ADMIN.getRole(), ADMIN.getValue());
        hashMap.put(USER.getRole(), USER.getValue());
        return hashMap.get(role);
    }
}

自定义一个Interceptor实现权限验证

@Slf4j
@Service
public class AuthRoleInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        String json = JSON.toJSONString(ResultVOUtil.error(ResultEnum.AUTHENTICATION_ERROR));
        User user = userService.getCurrentUser();
        //若当前用户为未认证用户则跳过权限验证,交给security做身份认证
        if (user == null) {
            return true;
        }
        log.info("============执行权限验证============");
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            //获取方法上的注解
            RoleNum roleNum = handlerMethod.getMethodAnnotation(RoleNum.class);
            if (roleNum == null) {
                return true;
            }
            //注解上的role对应的值
            Integer roleValue = roleNum.role().getValue();
            //用户数据库中对应的role值
            Integer userValue = user.getRole();
            log.info("RoleValue:{},userRole:{}", roleValue, userValue);
            //比较,判断权限
            if (userValue >= roleValue) {
                return true;
            } else {
                json = JSON.toJSONString(ResultVOUtil.error(ResultEnum.PERMISSION_DENNY));
                log.info("============权限不足===============");
            }
        }
        response.getWriter().append(json);
        return false;
    }
}

最后将自定义的拦截器配入

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private AuthRoleInterceptor authRoleInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authRoleInterceptor);
    }

}

注解的使用

直接使用在controller层所需的方法上 举例如下:

@GetMapping("/getAll")
    @RoleNum(role = RoleEnum.ADMIN)
    public Map<String, List<User>> getAllUser() {
        Map<String, List<User>> map = userService.getAllUser();
        return map;
    }

在访问controller层的url时,自定义的拦截器会对权限进行验证,如果用户权限大于等于当前页面需要的权限值,即可访问,反之返回权限不足。这样就简单的实现了权限验证。

你可能感兴趣的:(JAVA,EE)