4、自定義Zuul過濾器實現登錄鑒權實戰
簡介:自定義Zuul過濾器實現登錄鑒權實戰
1、新建一個filter包
2、新建一個類,繼承ZuulFilter,重寫里面的方法
3、在類頂部加注解,@Component,讓Spring掃描
package net.xdclass.apigateway.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; /** * 登錄過濾器 */ @Component public class LoginFilter extends ZuulFilter { /** * 過濾器類型,前置過濾器 * @return */ @Override public String filterType() { return PRE_TYPE; } /** * 過濾器順序,越小越先執行 * @return */ @Override public int filterOrder() { return 4; } /** * 過濾器是否生效 * @return */ @Override public boolean shouldFilter() { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); //System.out.println(request.getRequestURI()); ///apigateway/product/api/v1/product/list //System.out.println(request.getRequestURL()); //http://localhost:9000/apigateway/product/api/v1/product/list //ACL(BAT等大公司使用的權限列表策略) if ("/apigateway/order/api/v1/order/save".equalsIgnoreCase(request.getRequestURI())){ return true; }else if ("/apigateway/order/api/v1/order/list".equalsIgnoreCase(request.getRequestURI())){ return true; }else if ("/apigateway/order/api/v1/order/find".equalsIgnoreCase(request.getRequestURI())){ return true; } return false; } /** * 業務邏輯 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { //JWT RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); //token對象 String token = request.getHeader("token"); if(StringUtils.isBlank((token))){ token = request.getParameter("token"); } //登錄校驗邏輯 根據公司情況自定義 JWT(大公司用的登陸校驗策略 可實現跨域訪問) if (StringUtils.isBlank(token)) { requestContext.setSendZuulResponse(false); requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); } return null; } }
另外:shouldFilter代表這個過濾器是否生效
true代表生效,false代表不生效。那么什么情況下使用不生效呢,不生效干嘛還要寫這個filter類呢?
其實是有用的,有時我們會動態的決定讓不讓一個filter生效,譬如我們可能根據Request里是否攜帶某個參數來判斷是否需要生效,或者我們需要從上一個filter里接收某個數據來決定,再或者我們希望能手工控制是否生效(使用如Appolo之類的配置中心,來動態設置該字段)