Springboot 拦截器 + 自定义注解,实现权限控制

如果你尚未了解Springboot拦截器,请先看本人之前文章:Springboot 拦截器

为了让大家更加直观的了解,下面每个步骤都是先放代码,然后放对应代码的截图。

举例:我们以删除文章为例,假设文章只允许管理员删除。

(1)首先我们创建一个注解类:OnlyAdmin

package com.zyq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 管理员才允许的请求
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnlyAdmin {

}

(2)在后台对应的方法上,打上@OnlyAdmin注解

    /**
     * 删除博客文章
     */
    @OnlyAdmin
    @RequestMapping("/delete")
    @ResponseBody
    public Resp<String> delete(long id) {
        bokeService.delete(id);
        return Resp.success();
    }

(3) 在登陆拦截器中拦截请求,判断当前登陆用户是否拥有该权限(下面那几个方法不用实现)。

package com.zyq.interceptor;

import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.zyq.annotation.OnlyAdmin;
import com.zyq.beans.User;
import com.zyq.consts.SessionKey;
import com.zyq.tools.DateTool;

/**
 * 登录拦截器
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // 从session中获取用户对象(该对象在用户登录的时候存于session中)
        Object object = request.getSession().getAttribute(SessionKey.USER_OBJECT);
        // 用户未登录,则以游客身份登录
        if (object == null) {
            User user = new User();
            user.setId(-1L);
            user.setName("游客" + DateTool.formatDateTimeSecond(new Date()));
            request.getSession().setAttribute(SessionKey.USER_OBJECT, user);
        }
        // 请求的方法是否有注解
        boolean haveAnnotataion = handler.getClass().isAssignableFrom(HandlerMethod.class);
        if (haveAnnotataion) {
            // 检测是否有 @OnlyAdmin 注解
            OnlyAdmin oa = ((HandlerMethod)handler).getMethodAnnotation(OnlyAdmin.class);
            if (oa != null) {
                // 如果有 @OnlyAdmin则表明该方法只允许管理员删除
                Object user = request.getSession().getAttribute(SessionKey.USER_OBJECT);
                if (((User)user).getId().longValue() != 1L) { // 这里假设以ID为1为管理员
                    response.setCharacterEncoding("UTF-8");
                    response.setContentType("text/json;charset=utf-8");
                    PrintWriter pw = response.getWriter();
                    pw.flush();
                    pw.println("{\"msg\":\"你未有该权限\"}");
                    return false;
                }
            }
        }
        // 用户已登录,则返回true, 放行该请求
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        super.afterCompletion(request, response, handler, ex);
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        super.afterConcurrentHandlingStarted(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        super.postHandle(request, response, handler, modelAndView);
    }

}

(3)重启项目,不登录访问页面,然后执行删除操作。

(4)可以看到,游客并不能删除。

 (5)打开F12,你也可以看到,请求也是返回的未有权限操作。

 (6)现在点击退出游客模式,登陆管理员账号。

 (7)登陆管理员账户。

(8)登陆后,再次点击删除。

(9)可以看到文章已被删除了

【结尾语】

(1)我们这里通过id=1来当成管理员只是为了掩饰,真实场景的时候,为了给用户设不同的权限,是在user对象中有一个权限字段(比如role=1为超级管理员,role=2为管理员,role=3为游客这样的)

(2)真正做项目的时候,如果某个用户不具备某个功能的权限,一般是不给与显示的,比如我这个游客模式下是不应该显示【删除】这个按钮的,这里显示仅为演示效果。

Springboot的自定义注解,权限管理验证,你学会了吗?

-----------------------------------------------------------------------

码字不易,且看且点赞,点赞走一走,能活九十九。

-----------------------------------------------------------------------

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页