springsecurity+zuul實現token驗證和路由轉發(繼springsecurity後)

前面文章已經將springsecurity+jwt整合已經實現了,可是在微服務中還是少不了zuul的存在。

下面將整合springsecurity+zuul實現token驗證和路由轉發

 

首先在上一個項目中引入zuul依賴

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
		</dependency>

然後在啓動類加上

@EnableZuulProxy註解

然後在啓動類同級建一個zuul包(建在哪隨意,習慣重要的包與啓動類同級)

然後新建filter

package com.model.cloudall.securitypermission.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @author wqy
 * @version 1.0
 * @date 2020/5/29 9:45
 */
@Component
public class AccessTokenFilter extends ZuulFilter{

    @Override
    public Object run() throws ZuulException {

        RequestContext ctx = RequestContext.getCurrentContext();

        HttpServletRequest request = ctx.getRequest();

        System.out.println("請求路徑 : " + request.getRequestURL());
        System.out.println("請求方式 : " + request.getMethod());

        //先從header中獲取token
        String token = request.getHeader("token");

        //如果消息頭中的token爲null或空,則從參數中獲取
        if(null==token||token.equals("")){
            token = request.getParameter("token");
        }

        if(null==token||token.equals("")){
            ctx.setResponseStatusCode(401);
            ctx.setSendZuulResponse(false);
            ctx.setResponseBody("{\"result\":Failure}");
            ctx.set("isSuccess", false);
            return null;
        }else{
            ctx.setSendZuulResponse(true);// 對該請求進行路由
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);// 設值,讓下一個Filter看到上一個Filter的狀態
        }

        //ctx.setSendZuulResponse(true);
        //ctx.setResponseStatusCode(200);

        return null;
    }
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }
}

這個filter暫時沒有什麼用,只是用來看效果

當然了,這個filter在token驗證成功後,如果請求地址非本項目地址(也就是需要zuul轉發的路由)肯定會走這個方法

filterOrder是級別,0爲目前的最高級,數越小級別越高。

在yml中配置zuul

zuul:
  routes:
    #訪問路由(測試服務)
    servertest:
      path: /api/servertest/**
      #服務ID(name)
      serviceId: servertest
      #訪問路由(測試服務)
    dbone:
      path: /api/dbone/**
      #服務ID(name)
      serviceId: dbone

 

然後使用postman測試

servertest服務裏就是一個正常的fegin,裏面有個/tc/getTestMsg接口

 

然後就可以看見,token驗證成功後纔可以進行路由轉發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章