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

简介: 使用自定义注解,实现按钮权限控制【项目】
最近工作中,遇到一个需求,需要将某一个具体按钮收口到某一个人,于是就有了今天的记录。
思路就是:
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();
    }
}
相关文章
|
5月前
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
1011 0
|
5月前
|
SQL XML Java
若依框架 --- 使用数据权限功能
若依框架 --- 使用数据权限功能
805 0
|
10天前
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
41 1
|
3月前
|
存储 前端开发 JavaScript
前端菜单及按钮权限拦截,实现方案及思路
此实现方案基于vue框架,并需要依赖vue项目相关的库,router、store等等;前端同学要与后端同学协商,常规是让后端返回一个树结构的菜单数据,并且将所有的涉及权限控制的页面path给到后端,如果是按钮,需要把所有的按钮 code 码统一下,这是前期工作,很重要。
|
5月前
|
JavaScript 前端开发
若依 自定义实现导入功能
若依 自定义实现导入功能
116 1
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
97 0
|
5月前
|
缓存 前端开发 JavaScript
若依框架中的权限控制逻辑 ---- 菜单
若依框架中的权限控制逻辑 ---- 菜单
547 0
|
缓存 开发框架 安全
AOP的另类用法 (权限校验&&自定义注解)
告别了OOP编程, 迎来了一个新的AOP编程时代👍👍👍, 最近有同学问我AOP除了写日志还能干什么, 其实AOP能干的事情挺多的, 可能只是他们写的代码中暂时用不到. 其实如果当我们写一些简单的程序的时候, SpringSecurity完全用不到的时候, 就可以使用AOP与自定义注解来为角色的访问权限进行鉴定, 绝对比Security更轻量👉👉👉 我们在接触框架的时候经常会用到注解, 但是我们自己自定义注解的情况比较少, 一般都是配合切面编程使用, 一起来看看吧
202 0
|
安全 Java 数据安全/隐私保护
权限控制之动态权限注解使用说明|学习笔记
快速学习权限控制之动态权限注解使用说明
115 0
权限控制之动态权限注解使用说明|学习笔记
|
安全 Java 数据安全/隐私保护
权限控制之异常处理页面流程图|学习笔记
快速学习权限控制之异常处理页面流程图
128 0
权限控制之异常处理页面流程图|学习笔记