在WebMvcConfig中添加了一个自定义的拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
//自己定义的权限拦截器
@Resource
private PermissionInterceptor permissionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//对全部的接口进行权限拦截
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
}
}
自定义的权限注解@PermissionLimit
这个注解可以用在controller层的接口上
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionLimit {
/**
* 登录拦截 (默认拦截)
*/
boolean limit() default true;
/**
* 要求管理员权限
*
* @return
*/
boolean adminuser() default false;
}
权限拦截器
@Component
public class PermissionInterceptor implements HandlerInterceptor {
@Resource
private LoginService loginService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果请求的不是方法,不需要拦截
if (!(handler instanceof HandlerMethod)) {
return true; // proceed with the next interceptor
}
boolean needLogin = true;//是否需要登录,是
boolean needAdminuser = false;//是否需要管理员权限,否
//判断controller层接口上有没有注解@PermissionLimit
// 如果有就拿到参数,没有按照默认的需要登录且不需要管理员权限
HandlerMethod method = (HandlerMethod)handler;
PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);
//有注解,去拿参数
if (permission!=null) {
needLogin = permission.limit();
needAdminuser = permission.adminuser();
}
//需要登录
if (needLogin) {
//登录拦截,根据cookie中的信息去判断是否登录,并且返回登录者的信息
//这段代码的作用是根据request获得cookie,然后再根据key:LOGIN_IDENTITY_KEY去cookie拿到用户user1信息,
//然后根据use1的username去数据库中查到user2,如果存在,就判断user1和user2的密码是否一致,一致就该用户,不一致就返回null
XxlJobUser loginUser = loginService.ifLogin(request, response);
if (loginUser == null) {
//不存在
response.setStatus(302);
response.setHeader("location", request.getContextPath()+"/toLogin");
return false;
}
//需要管理员权限,但是没有
if (needAdminuser && loginUser.getRole()!=1) {
throw new RuntimeException(I18nUtil.getString("system_permission_limit"));
}
//把用户信息放到request中
request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);
}
return true; // proceed with the next interceptor
}
}