Zuul鉴权和添加用户服务
生活随笔
收集整理的這篇文章主要介紹了
Zuul鉴权和添加用户服务
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
來(lái)實(shí)現(xiàn)Zuul的權(quán)限校驗(yàn),我們要實(shí)現(xiàn)下面三個(gè)功能,看第一個(gè)api,叫/order/create,創(chuàng)建訂單,這個(gè)API只能由買家來(lái)訪問(wèn),第二個(gè)是order/finish,這是完結(jié)訂單,這個(gè)API我們之前還沒(méi)有寫,待會(huì)我們來(lái)寫一下,買家下單之后,那么賣家來(lái)接單,接單之后這個(gè)狀態(tài)要置為完結(jié)狀態(tài),就是使用這個(gè)API,第三個(gè)是/product/list,這是獲取商品的列表,第三個(gè)接下來(lái)就結(jié)合項(xiàng)目,之前寫了一個(gè)TokenFilter,這里也是一個(gè)校驗(yàn),它是一個(gè)PRE類型,我們先把之前的token攔截給他注釋掉,@Override
public Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//這里從url參數(shù)里獲取, 也可以從cookie, header里獲取String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {
// requestContext.setSendZuulResponse(false);
// requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;
}現(xiàn)在再來(lái)新建一個(gè)權(quán)限的校驗(yàn),我們可以復(fù)制一下TokenFilter,主要要對(duì)三個(gè)API做不同的處理,/order/create這是創(chuàng)建訂單,只能買家訪問(wèn),finish只能賣家訪問(wèn),product/list都可訪問(wèn),待會(huì)我們功能就要寫到這個(gè)地方,那么我們來(lái)想一下,怎么樣才區(qū)分買家和賣家呢,無(wú)非這兩者的目的就是區(qū)分這兩者,有朋友可能會(huì)說(shuō),通過(guò)cookie,既然能夠想到cookie的話,那必須先登錄了之后,才能獲取到他們的信息,那登錄功能又應(yīng)該寫到哪兒呢,這肯定是應(yīng)該寫到一個(gè)用戶服務(wù)里面,所以接下來(lái)我們要?jiǎng)?chuàng)建一個(gè)用戶服務(wù),那這個(gè)用戶服務(wù)我們先也不著急創(chuàng)建,我們先來(lái)分析一下,他應(yīng)該有哪些功能,數(shù)據(jù)庫(kù)表應(yīng)該是什么樣子的,這里我寫了一份API,這里有一個(gè)買家登陸和賣家登陸的接口,我們先看看買家登陸,這是一個(gè)GET請(qǐng)求,login.buyer,參數(shù)是openid,abc只是一個(gè)例子,看一下返回,返回會(huì)返回一個(gè)JSON的數(shù)據(jù),返回的同時(shí)后端代碼會(huì)做一個(gè)事情,就是設(shè)置cookie里面設(shè)置openid等于abc,也就是把內(nèi)容設(shè)置到cookie里面去,那這個(gè)登陸接口大家可能會(huì)覺(jué)得比較奇怪,openid是什么東西,我們這個(gè)登陸和傳統(tǒng)的使用賬號(hào)和密碼登陸其實(shí)是不大一樣的,點(diǎn)餐的服務(wù)登陸是使用的微信的授權(quán),授權(quán)之后可以從微信那兒獲取到用戶的唯一標(biāo)識(shí),叫做openid,他的內(nèi)容就是惟一的,我們使用這個(gè)來(lái)進(jìn)行登陸,我這個(gè)依舊這么設(shè)計(jì)呢,是為了最大化的保持一致,這樣也方便大家理解,其實(shí)重點(diǎn)在于什么呢,重點(diǎn)就是返回的時(shí)候,他要在cookie里面設(shè)置這么一個(gè)內(nèi)容,看一下賣家登陸,賣家登陸也是使用了微信的授權(quán),用到了微信的掃碼登陸,就是授權(quán),就是獲取openid,這里為了區(qū)別我故意寫了一個(gè)xyz,也是openid的具體內(nèi)容,當(dāng)時(shí)我們賣家登陸,返回的時(shí)候做了一件事情,有別于買家登陸,賣家登陸設(shè)置值為token=uuid,UUID也是JAVA代碼后端生成的,同時(shí)也會(huì)在redis里面設(shè)置一個(gè)值,key就等于前面的uuid,value是里面的內(nèi)容,xyz,注意要注意的就是這兩點(diǎn),看一下數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)就非常簡(jiǎn)單了,也是為了盡量保持一致-- 用戶
CREATE TABLE `user_info` (`id` varchar(32) NOT NULL,`username` varchar(32) DEFAULT '',`password` varchar(32) DEFAULT '',`openid` varchar(64) DEFAULT '' COMMENT '微信openid',`role` tinyint(1) NOT NULL COMMENT '1買家2賣家',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間',PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;表名user_info,username和password我們暫時(shí)用不到,我只是設(shè)計(jì)的時(shí)候先這么設(shè)計(jì)進(jìn)去,這里有一個(gè)openid,這里有一個(gè)字段叫role,1是買家,2是賣家,就是通過(guò)這個(gè)來(lái)判斷,數(shù)據(jù)庫(kù)也非常的簡(jiǎn)單,接下來(lái)我們就來(lái)創(chuàng)建user項(xiàng)目,首先ereka和config要選上,我們要用到配置Config Client,數(shù)據(jù)庫(kù)也要用到,還有我們會(huì)操作Redis,基本上先這些user我們這里用到了數(shù)據(jù)庫(kù)和Redis,數(shù)據(jù)庫(kù)和Redis,新建user的一個(gè)配置文件,我們使用order-test.yml拷貝一份過(guò)去,我們只需要配數(shù)據(jù)庫(kù)和Redis,這上面寫完是沒(méi)有提示的,大家要測(cè)試一下,避免寫錯(cuò),我們看一下測(cè)試文件有沒(méi)有問(wèn)題,我們先通過(guò)配置中心看一下配置是否有問(wèn)題localhost:8080/user-dev.yml這樣子可以出來(lái),格式是沒(méi)有問(wèn)題的,我們來(lái)啟動(dòng)一下user這個(gè)項(xiàng)目59.110.138.145:8761已經(jīng)成功啟動(dòng)了,因?yàn)槲覀冎暗挠唵芜€有商品,這兩個(gè)服務(wù)都用了多模塊,像user這樣的服務(wù)肯定是會(huì)對(duì)外提供接口的,所以我們這里也把他改成多模塊,我們目前只用到server這個(gè)模塊,以后要提供接口就使用client模塊
package com.learn.cloud.filter;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;import com.learn.cloud.utill.CookieUtil;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;/*** 權(quán)限攔截 區(qū)分買家和賣家*/
@Component
public class AuthFilter extends ZuulFilter {/*FilterConstants*/@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}@Overridepublic int filterOrder() {return FilterConstants.PRE_DECORATION_FILTER_ORDER-1;}@Overridepublic boolean shouldFilter() {return true;}/*** 前置邏輯寫在run方法內(nèi)* @return* @throws ZuulException*/@Overridepublic Object run() {RequestContext requestContext= RequestContext.getCurrentContext();HttpServletRequest request= requestContext.getRequest();//create 只能買家訪問(wèn)//finish 只能賣家訪問(wèn)//list 都可訪問(wèn)if("/product/productInfo".equals(request.getRequestURI())){//cookie為空認(rèn)為沒(méi)有權(quán)限Cookie cookie = CookieUtil.get(request,"openid");if (cookie==null || StringUtils.isEmpty(cookie.getValue())){requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);}}return null;}
}
package com.learn.cloud.utill;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class CookieUtil {/*** 設(shè)置cookie* @param response* @param name* @param value* @param maxAge*/public static void set(HttpServletResponse response,String name,String value,int maxAge){Cookie cookie =new Cookie(name,value);cookie.setPath("/");cookie.setMaxAge(maxAge);response.addCookie(cookie);}/*** 獲取cookie* @param request* @param name* @return*/public static Cookie get(HttpServletRequest request,String name){Cookie[] cookies = request.getCookies();if(cookies!=null){for (Cookie cookie:cookies){if (name.equals(cookie.getName())){return cookie;}}}return null;}
}
?
總結(jié)
以上是生活随笔為你收集整理的Zuul鉴权和添加用户服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringCloud_Sell.sql
- 下一篇: Exception processing