springcloud7-自定義Zuul過濾器實現登錄鑒權實戰


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之類的配置中心,來動態設置該字段)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM