content: package com.xxl.job.admin.controller.interceptor;
  
  import com.xxl.job.admin.controller.annotation.PermissionLimit;
  import com.xxl.job.admin.core.model.XxlJobUser;
  import com.xxl.job.admin.core.util.I18nUtil;
  import com.xxl.job.admin.service.LoginService;
  import org.springframework.stereotype.Component;
  import org.springframework.web.method.HandlerMethod;
  import org.springframework.web.servlet.HandlerInterceptor;
  
  import javax.annotation.Resource;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.util.Arrays;
  
  /**
   * 权限拦截
   *
   * @author xuxueli 2015-12-12 18:09:04
   */
  @Component
  public class PermissionInterceptor implements HandlerInterceptor {
  
  	/**
  	 * 针对 spring boot admin 对外暴露的接口
  	 */
  	private static final String[] ACTUATOR_IGNORE = { "/actuator", "/details", "/health" };
  
  	@Resource
  	private LoginService loginService;
  
  	@Override
  	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  			throws Exception {
  
  		if (!(handler instanceof HandlerMethod)) {
  			return true;
  		}
  
  		if (Arrays.stream(ACTUATOR_IGNORE).anyMatch(s -> request.getRequestURI().contains(s))) {
  			return true;
  		}
  
  		// if need login
  		boolean needLogin = true;
  		boolean needAdminuser = false;
  		HandlerMethod method = (HandlerMethod) handler;
  		PermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);
  		if (permission != null) {
  			needLogin = permission.limit();
  			needAdminuser = permission.adminuser();
  		}
  
  		if (needLogin ) {
  			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.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);
  		}
  
  		return true;
  	}
  
  }
  