博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用自定义注解在SpringMVC中实现自定义权限检查
阅读量:5922 次
发布时间:2019-06-19

本文共 2969 字,大约阅读时间需要 9 分钟。

hot3.png

先描述一下应用场景,基于Spring MVC的WEB程序,需要对每个Action进行权限判断,当前用户有权限则允许执行Action,无权限要出错提示。权限有很多种,比如用户管理权限、日志审计权限、系统配置权限等等,每种权限还会带参数,比如各个权限还要区分读权限还是写权限。

想实现统一的权限检查,就要对Action进行拦截,一般是通过拦截器来做,可以实现HandlerInterceptor或者HandlerInterceptorAdapter,但是每个Action都有不同的权限检查,比如getUsers要用户管理的读权限,deleteLogs要日志审计的写权限,只定义一个拦截器很难做到,为每种权限定义一个拦截器又太乱,此时可以通过自定义注解来标明每个Action需要什么权限,然后在单一的拦截器里就可以统一检查了。

具体这么做,先实现一个自定义注解,名叫AuthCheck:

package com.test.web;import java.lang.annotation.Documented;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.RetentionPolicy;@Documented@Target(ElementType.METHOD)@Inherited@Retention(RetentionPolicy.RUNTIME)public @interface AuthCheck {    /**     * 权限类型     * @return     */    String type() default "";    /**     * 是否需要写权限     * @return     */    boolean write() default false;}

这个注解里包含2个属性,分别用于标定权限的类型与读写要求。然后为需要检查权限的Action加注解,此处以getUsers和deleteLogs为例,前者要求对用户管理有读权限,后者要求对日志审计有写权限,注意@AuthCheck的用法:

@AuthCheck(type = "user", write = false)@RequestMapping(value = "/getUsers", method = RequestMethod.POST)@ResponseBodypublic JsonResponse getUsers(@RequestBody GetUsersRequest request) {    //具体实现,略}@AuthCheck(type = "log", write = true)@RequestMapping(value = "/deleteLogs", method = RequestMethod.POST)@ResponseBodypublic JsonResponse deleteLogs(@RequestBody DeleteLogsRequest request) {    //具体实现,略}

最后要实现拦截器:

package com.test.web;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;/** * 全局拦截器 */public class ActionInterceptor implements HandlerInterceptor {    /**     * 前置拦截,用于检查身份与权限     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        //从传入的handler中检查是否有AuthCheck的声明        HandlerMethod method = (HandlerMethod)handler;        AuthCheck auth = method.getMethodAnnotation(AuthCheck.class);                //找到了,取出定义的权限属性,结合身份信息进行检查        if(auth != null) {            String type = auth.type();            boolean write = auth.write();                        //根据type与write,结合session/cookie等身份信息进行检查            //如果权限检查不通过,可以输出特定信息、进行跳转等操作            //并且一定要return false,表示被拦截的方法不用继续执行了        }              //检查通过,返回true,方法会继续执行        return true;    }        @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView model) throws Exception {    }        @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {    }}

拦截器要生效,还要配置一下:

OK,搞定收工。

转载于:https://my.oschina.net/dylan2hdf/blog/1524624

你可能感兴趣的文章
java虚拟机学习笔记 【1】
查看>>
DUBBO笔记
查看>>
scala基础续
查看>>
nginx php上传大文件的设置(php-fpm)
查看>>
MySQL 运行状态监控方法
查看>>
Fedora 12 环境下Gtk+开发环境配置
查看>>
vs2008中在解决方案资源管理器查看当前打开文件
查看>>
ubuntu14.04 鼠标闪烁问题
查看>>
jQuery Lightbox(balupton版)图片展示插件demo
查看>>
Elasticsearch集群的简单搭建
查看>>
SCRT-SSH传输文件
查看>>
VOA 26/02/2009 EDUCATION REPORT - Studying in the US: Web Redefines the College Visit
查看>>
缓冲池相关
查看>>
foxmail A message does not have receiver解决方法
查看>>
slidingMenu
查看>>
AngularJS之控制器
查看>>
PIC32多媒体开发板
查看>>
禁止搜索引擎转码方法
查看>>
l洛谷——P1211 [USACO1.3]牛式 Prime Cryptarithm
查看>>
域模式中批量创建用户
查看>>