使用自定义注解,实现按钮权限控制【项目】

简介: 使用自定义注解,实现按钮权限控制【项目】
最近工作中,遇到一个需求,需要将某一个具体按钮收口到某一个人,于是就有了今天的记录。
思路就是:
1、创建注解,用于控制拦截的路径,以及是否拦截;
2、创建拦截器,在preHandler 里面 获取用户信息,然后判断用户信息是否具有某一权限或者是具有某一方法的执行权限(方法都是绑定到某一具体按钮的 所以方法的权限就相当于是按钮的权限)
3、配置拦截器,将拦截器添加,并添加具体拦截的访问路径,交由Spring管理。
首先创建自定义注解
/**
 * @Author yanjun
 * @Date 2021/11/18 10:12
 * 自定义注解 用于实现权限控制
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthorizedLimit {
    /**
     * 是否拦截
     */
    boolean limit() default  true;
    /**
     * 资源路径
     */
    String resourcePath();
}
在需要拦截的按钮触发的方法Controller上添加注解@AuthorizedLimit(resourcePath="")如下
@PostMapping("/aaa")
@AuthorizedLimit(resourcePath = "/aaa")
创建拦截器适配器 执行具体逻辑
/**
 * @Author yanjun
 * @Date 2021/11/18 10:24
 * <p>
 * 拦截器适配器
 * 判断用户是否是需要拦截
 */
@Component
public class AuthorizedInterceptor extends HandlerInterceptorAdapter {
    private Logger logger = LoggerFactory.getLogger(AuthorizedInterceptor.class);
    @Autowired
    private AuthorizationHelper authorizationHelper;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            return super.preHandle(request, response, handler);
        }
        HandlerMethod method = ((HandlerMethod) handler);
        AuthorizedLimit authorizedLimit = method.getMethodAnnotation(AuthorizedLimit.class);
        /**
         * 判断注解不为空 且标注该注解的方法被拦截
         */
        if (null != authorizedLimit && authorizedLimit.limit()) {
            //获取登陆人信息
            String userName = "yanjun";
            //获取资源路径
            String resourcePath = authorizedLimit.resourcePath();
            if (!authorizationHelper.hasResourceAuthorized(userName, resourcePath)) {
                noPermission( response);
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
    /**
     * 没有权限的处理方式
     * @param response
     */
    private void noPermission(HttpServletResponse response) {
        try {
            /*设置响应头编码格式*/
            response.setHeader("Content-Type","text/html;charset=utf-8");
            OutputStream out = response.getOutputStream();
            JSONObject dealMsg= new JSONObject();
            dealMsg.put("code", 403);
            dealMsg.put("msg", "抱歉,您没有访问权限,请联系"+"【xxx】");
            out.write(dealMsg.toJSONString().getBytes());
            out.flush();
            //关流
            out.close();
        } catch (IOException e) {
            logger.error(LogUtil.formatLog("AuthorizedInterceptor", "noPermission", "noPermissionError", "", "", "处理权限出错!"), e);
        }
    }
}
创建帮助类 用于判断 用户是否具有某一权限
/**
 * @Author yanjun
 * @Date 2021/11/18 10:26
 * 判断用户是否具有某一权限
 */
@Component
public class AuthorizationHelper {
    /**
     * 判断用户是否具有某一资源路径的方法
     * @param userName      用户名
     * @param resourcePath  资源路径
     * @return
     */
    public boolean hasResourceAuthorized(String userName,String resourcePath){
        if(StringUtils.isEmpty(userName) || StringUtils.isEmpty(resourcePath)){
            return false;
        }
        /**
         * 判断用户是否是某一指定用户
         */
        if(userName.equals("yanjun") && resourcePath.equals("/aaa")){
            return true;
        }else {
            return false;
        }
    }
}
最后 将拦截器注册
/**
 * @Author yanjun
 * @Date 2021/11/18 11:12
 * 配置拦截器 拦截请求
 */
@Configuration
public class AuthorizedLimitConfig extends WebMvcConfigurer {
    /**
     * 将拦截器添加
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getAuthorizedInterceptor()).addPathPatterns("/rule-module-config/updateState");
    }
    /**
     * 获取自定义拦截器
     * @return
     */
    @Bean
    AuthorizedInterceptor getAuthorizedInterceptor(){
        return new AuthorizedInterceptor();
    }
}
相关文章
|
6月前
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
1111 0
|
6月前
|
SQL XML Java
若依框架 --- 使用数据权限功能
若依框架 --- 使用数据权限功能
837 0
|
6月前
|
JavaScript 前端开发
若依 自定义实现导入功能
若依 自定义实现导入功能
153 1
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
100 0
|
6月前
|
缓存 前端开发 JavaScript
若依框架中的权限控制逻辑 ---- 菜单
若依框架中的权限控制逻辑 ---- 菜单
639 0
|
缓存 开发框架 安全
AOP的另类用法 (权限校验&&自定义注解)
告别了OOP编程, 迎来了一个新的AOP编程时代👍👍👍, 最近有同学问我AOP除了写日志还能干什么, 其实AOP能干的事情挺多的, 可能只是他们写的代码中暂时用不到. 其实如果当我们写一些简单的程序的时候, SpringSecurity完全用不到的时候, 就可以使用AOP与自定义注解来为角色的访问权限进行鉴定, 绝对比Security更轻量👉👉👉 我们在接触框架的时候经常会用到注解, 但是我们自己自定义注解的情况比较少, 一般都是配合切面编程使用, 一起来看看吧
206 0
|
安全 Java 数据安全/隐私保护
权限控制之动态权限注解使用说明|学习笔记
快速学习权限控制之动态权限注解使用说明
权限控制之动态权限注解使用说明|学习笔记
|
安全 前端开发 Java
权限控制之开启动态权限注解支持|学习笔记
快速学习权限控制之开启动态权限注解支持
权限控制之开启动态权限注解支持|学习笔记
|
数据安全/隐私保护
使用自定义注解,实现按钮权限控制【项目】
使用自定义注解,实现按钮权限控制【项目】
121 0
|
安全 Java 数据库
SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理
提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。
84118 6