首页 > 编程知识 正文

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

时间:2023-05-06 01:17:25 阅读:199898 作者:1572

如果你尚未了解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的自定义注解,权限管理验证,你学会了吗?

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。