api regan springboot_springboot 基于api权限的认证例子

秦英发
2023-12-01

packagecom.common.Interceptor;importcom.common.utils.JwtUtils;importio.jsonwebtoken.Claims;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.ModelAndView;importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Date;/*** 自定义拦截器 ,作用不用再在每个方法前都去解析token了

* .在preHandle中,可以进行编码、安全控制等处理;进入到api接口之前要做的事 必须要有布尔类型的返回值

* true 表示可以继续执行

* false 拦截了表示 不能往下执行了

* 2.在postHandle中,有机会修改ModelAndView; 执行api方法之后要干的事

* 3.在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 所有的请求结束之后要做的事*/@Componentpublic class JwtInterceptor extendsHandlerInterceptorAdapter {

@AutowiredprivateJwtUtils jwtUtils;publicJwtInterceptor() {super();

}

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {/*** 简化获取token 数据的代码编写

* 统一用户的权限校验 即是否登录

* 也可以判断当前用户是否有当前访问接口的权限*/

//1.通过request 获取token

String authorization = request.getHeader("Authorization");//spring 判断为空的方法

if(!StringUtils.isEmpty(authorization)&&authorization.startsWith("Bearer")){//表示该用户登录//获取到token 信息

String token = authorization.replace("Bearer", "");

Claims claims=jwtUtils.parseJwt(token);//claims.get("userName"); 获取设置的用户//设置claims 到请求中 new Date(System.currentTimeMillis())//Date issuedAt = claims.getIssuedAt();//System.out.println("issuedAt "+issuedAt);

if(claims!=null) {//通过handler 获取要执行的controller 的方法

HandlerMethod h=(HandlerMethod) handler;//获取到了 RequestMapping 注解//如果要控制权限的controller 方法 注解是 RequestMapping 那么 就是下面这种//RequestMapping methodAnnotation = h.getMethodAnnotation(RequestMapping.class);获取方式 ,对应的都要改变//否则获取到的name就为空

GetMapping methodAnnotation = h.getMethodAnnotation(GetMapping.class);//获取到了 RequestMapping 注解的方法名

String name =methodAnnotation.name();//自己写死的一个权限 如果这个Controller中的方法 RequestMapping注解请求名为 parse 就通过 否则没有权限

if("parse".equals(name)){//设置claims 到request 域上

request.setAttribute("claims", claims);return true;

}else{

PrintWriter out1= null;try{

response.setHeader("Content-type", "text/html;charset=UTF-8");

out1=response.getWriter();

out1.append("{\"success\":false,\"code\":wa wa,\"msg\":\"您已经下台,没有权限\"}");

}catch(IOException e){

e.printStackTrace();

}finally{if (out1 != null) {

out1.close();

}

}

}

}

}//表示该用户没有登录,输出 出错信息

PrintWriter out = null;try{

response.setHeader("Content-type", "text/html;charset=UTF-8");

out=response.getWriter();

out.append("{\"success\":false,\"code\":SOS,\"msg\":\"您已经被蓝金黄了,请重新登录\"}");

}catch(IOException e){

e.printStackTrace();

}finally{if (out != null) {

out.close();

}

}return false;

}

@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throwsException {super.postHandle(request, response, handler, modelAndView);

}

@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throwsException {super.afterCompletion(request, response, handler, ex);

}

}

 类似资料: