国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

只要三個注解,優雅的實現微服務鑒權!

開發 架構
本文主要介紹了微服務中如何將鑒權下放到微服務中,也是為了解決讀者的疑惑,實際生產中除非業務需要,陳某還是建議將鑒權統一放到網關中。

前面的文章中介紹了網關集成Spring Security實現網關層面的統一的認證鑒權。

  1. 鑒權放在各個微服務中如何做?
  2. feign的調用如何做到的鑒權?

今天針對以上兩個問題深入聊聊如何通過三個注解解決。

前面的幾篇文章陳某都是將鑒權和認證統一的放在了網關層面,架構如下:

圖片

微服務中的鑒權還有另外一種思路:將鑒權交給下游的各個微服務,網關層面只做路由轉發。

這種思路其實實現起來也是很簡單,下面針對網關層面鑒權的代碼改造一下即可完成:實戰干貨!Spring Cloud Gateway 整合 OAuth2.0 實現分布式統一認證授權!

1. 干掉鑒權管理器

在網關統一鑒權實際是依賴的鑒權管理器ReactiveAuthorizationManager,所有的請求都需要經過鑒權管理器的去對登錄用戶的權限進行鑒權。

這個鑒權管理器在網關鑒權的文章中也有介紹,在陳某的《Spring Cloud Alibaba 實戰》中配置攔截也很簡單,如下:

圖片

除了配置的白名單,其他的請求一律都要被網關的鑒權管理器攔截鑒權,只有鑒權通過才能放行路由轉發給下游服務。

看到這里思路是不是很清楚了,想要將鑒權交給下游服務,只需要在網關層面直接放行,不走鑒權管理器,代碼如下:

http
....
//白名單直接放行
.pathMatchers(ArrayUtil.toArray(whiteUrls.getUrls(), String.class)).permitAll()
//其他的任何請求直接放行
.anyExchange().permitAll()
.....

2. 定義三個注解

經過第①步,鑒權已經下放給下游服務了,那么下游服務如何進行攔截鑒權呢?

其實Spring Security 提供了3個注解用于控制權限,如下:

  1. @Secured
  2. @PreAuthorize
  3. @PostAuthorize

關于這三個注解就不再詳細介紹了,有興趣的可以去查閱官方文檔。

陳某這里并不打算使用的內置的三個注解實現,而是自定義了三個注解,如下:

1).@RequiresLogin

見名知意,只有用戶登錄才能放行,代碼如下:

/**
* @author 公眾號:碼猿技術專欄
* @url: www.java-family.cn
* @description 登錄認證的注解,標注在controller方法上,一定要是登錄才能的訪問的接口
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RequiresLogin {
}

2).@RequiresPermissions

見名知意,只有擁有指定權限才能放行,代碼如下:

/**
* @author 公眾號:碼猿技術專欄
* @url: www.java-family.cn
* @description 標注在controller方法上,確保擁有指定權限才能訪問該接口
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RequiresPermissions {
/**
* 需要校驗的權限碼
*/
String[] value() default {};

/**
* 驗證模式:AND | OR,默認AND
*/
Logical logical() default Logical.AND;
}

3).@RequiresRoles

見名知意,只有擁有指定角色才能放行,代碼如下:

/**
* @author 公眾號:碼猿技術專欄
* @url: www.java-family.cn
* @description 標注在controller方法上,確保擁有指定的角色才能訪問該接口
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RequiresRoles {
/**
* 需要校驗的角色標識,默認超管和管理員
*/
String[] value() default {OAuthConstant.ROLE_ROOT_CODE,OAuthConstant.ROLE_ADMIN_CODE};

/**
* 驗證邏輯:AND | OR,默認AND
*/
Logical logical() default Logical.AND;
}

以上三個注解的含義想必都很好理解,這里就不再解釋了....

3. 注解切面定義

注解有了,那么如何去攔截呢?這里陳某定義了一個切面進行攔截,關鍵代碼如下:

/**
* @author 公眾號:碼猿技術專欄
* @url: www.java-family.cn
* @description @RequiresLogin,@RequiresPermissions,@RequiresRoles 注解的切面
*/
@Aspect
@Component
public class PreAuthorizeAspect {
/**
* 構建
*/
public PreAuthorizeAspect() {
}

/**
* 定義AOP簽名 (切入所有使用鑒權注解的方法)
*/
public static final String POINTCUT_SIGN = " @annotation(com.mugu.blog.common.annotation.RequiresLogin) || "
+ "@annotation(com.mugu.blog.common.annotation.RequiresPermissions) || "
+ "@annotation(com.mugu.blog.common.annotation.RequiresRoles)";

/**
* 聲明AOP簽名
*/
@Pointcut(POINTCUT_SIGN)
public void pointcut() {
}

/**
* 環繞切入
*
* @param joinPoint 切面對象
* @return 底層方法執行后的返回值
* @throws Throwable 底層方法拋出的異常
*/
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 注解鑒權
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
checkMethodAnnotation(signature.getMethod());
try {
// 執行原有邏輯
Object obj = joinPoint.proceed();
return obj;
} catch (Throwable e) {
throw e;
}
}

/**
* 對一個Method對象進行注解檢查
*/
public void checkMethodAnnotation(Method method) {
// 校驗 @RequiresLogin 注解
RequiresLogin requiresLogin = method.getAnnotation(RequiresLogin.class);
if (requiresLogin != null) {
doCheckLogin();
}

// 校驗 @RequiresRoles 注解
RequiresRoles requiresRoles = method.getAnnotation(RequiresRoles.class);
if (requiresRoles != null) {
doCheckRole(requiresRoles);
}

// 校驗 @RequiresPermissions 注解
RequiresPermissions requiresPermissions = method.getAnnotation(RequiresPermissions.class);
if (requiresPermissions != null) {
doCheckPermissions(requiresPermissions);
}
}


/**
* 校驗有無登錄
*/
private void doCheckLogin() {
LoginVal loginVal = SecurityContextHolder.get();
if (Objects.isNull(loginVal))
throw new ServiceException(ResultCode.INVALID_TOKEN.getCode(), ResultCode.INVALID_TOKEN.getMsg());
}

/**
* 校驗有無對應的角色
*/
private void doCheckRole(RequiresRoles requiresRoles){
String[] roles = requiresRoles.value();
LoginVal loginVal = OauthUtils.getCurrentUser();

//該登錄用戶對應的角色
String[] authorities = loginVal.getAuthorities();
boolean match=false;

//and 邏輯
if (requiresRoles.logical()==Logical.AND){
match = Arrays.stream(authorities).filter(StrUtil::isNotBlank).allMatch(item -> CollectionUtil.contains(Arrays.asList(roles), item));
}else{ //OR 邏輯
match = Arrays.stream(authorities).filter(StrUtil::isNotBlank).anyMatch(item -> CollectionUtil.contains(Arrays.asList(roles), item));
}

if (!match)
throw new ServiceException(ResultCode.NO_PERMISSION.getCode(), ResultCode.NO_PERMISSION.getMsg());
}

/**
* TODO 自己實現,由于并未集成前端的菜單權限,根據業務需求自己實現
*/
private void doCheckPermissions(RequiresPermissions requiresPermissions){

}
}

其實這中間的邏輯非常簡單,就是解析的Token中的權限、角色然后和注解中的指定的進行比對。

@RequiresPermissions這個注解的邏輯陳某并未實現,自己根據業務模仿著完成,算是一道思考題了....

4. 注解使用

比如《Spring Cloud Alibaba 實戰》項目中有一個添加文章的接口,只有超管和管理員的角色才能添加,那么可以使用@RequiresRoles注解進行標注,如下:

@RequiresRoles
@AvoidRepeatableCommit
@ApiOperation("添加文章")
@PostMapping("/add")
public ResultMsg<Void> add(@RequestBody @Valid ArticleAddReq req){
.......
}

效果這里就不演示了,實際的效果:非超管和管理員角色用戶登錄訪問,將會直接被攔截,返回無權限。

注意:這里僅僅解決了下游服務鑒權的問題,那么feign調用是否也適用?

當然適用,這里使用的是切面方式,feign內部其實使用的是http方式調用,對于接口來說一樣適用。

比如《Spring Cloud Alibaba 實戰》項目中獲取文章列表的接口,其中會通過feign的方式調用評論服務中的接口獲取文章評論總數,這里一旦加上了@RequiresRoles,那么調用將會失敗,代碼如下:

@RequiresRoles
@ApiOperation(value = "批量獲取文章總數")
@PostMapping(value = "/list/total")
public ResultMsg<List<TotalVo>> listTotal(@RequestBody @Valid List<CommentListReq> param){
....
}

總結

本文主要介紹了微服務中如何將鑒權下放到微服務中,也是為了解決讀者的疑惑,實際生產中除非業務需要,陳某還是建議將鑒權統一放到網關中。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2022-05-31 08:36:41

微服務網關鑒權

2025-07-30 09:15:22

2018-01-10 14:22:05

2025-08-01 09:25:30

2022-12-02 16:28:47

2022-04-08 09:00:00

微服務架構安全防火墻

2022-05-13 14:01:46

微服務架構安全微服務

2009-09-16 11:44:26

IT運維

2024-11-08 15:56:36

2022-06-21 14:44:38

接口數據脫敏

2024-11-07 10:55:26

2023-12-20 16:26:43

微服務軟件開發

2024-01-10 09:00:00

云計算架構

2012-02-21 10:30:35

業務靈活性IT架構

2023-08-07 09:12:51

權限SpringSecurity

2025-02-23 08:00:00

冪等性Java開發

2019-09-25 08:57:24

單體式架構微服務

2023-04-26 11:14:11

IT領導者遠程工作

2022-10-13 14:15:35

商業智能大數據工具

2021-07-07 07:44:20

微服務Nacos緩存
點贊
收藏

51CTO技術棧公眾號

欧美变态另类刺激| 不卡亚洲精品| 国精产品一区一区三区mba桃花| 久久免费视频在线| 亚洲美女久久精品| 欧美性做爰猛烈叫床潮| 免费yellow网站| 久久亚洲二区三区| 日本男女交配视频| 日本午夜精品视频在线观看 | 久久久久久久影视| 亚洲乱码国产乱码精品精98午夜 | 亚洲大尺度美女在线| 中文字幕在线观看| 亚洲视频免费观看| 国产精品va无码一区二区| 国产呦萝稀缺另类资源| 神马影院一区二区三区| 欧美三级小说| 亚洲一区二区三区香蕉| 欧美精品一区二区久久| 国内精品久久久久| 91成人精品在线| 欧美激情中文网| 精品在线网站观看| 88国产精品欧美一区二区三区| 911亚洲精品| 欧美一级免费视频| 亚洲人成伊人成综合图片| 欧美国产乱视频| 天堂精品在线视频| 午夜精品一区二区三区在线播放| 欧洲一区在线| 97国产精品人人爽人人做| 国产精品黄网站| 欧美影院久久久| 精品高清在线| 国产日本欧美一区二区三区在线| 国产精品久久久久9999赢消| 国产精品网红直播| 欧美亚洲不卡| 久久国产精品一区二区三区| 雨宫琴音一区二区在线| 欧美高清视频一区二区三区在线观看| 影音先锋亚洲精品| 日韩影视精品| 国产成人高清视频| 成年人网站大全| 亚洲福利国产精品| 欧美jizzhd69巨大| 亚洲欧美激情四射在线日| 91嫩草国产线观看亚洲一区二区| 97精品伊人久久久大香线蕉| 欧美日韩精品一区二区视频| 国产91视觉| 狠狠色丁香久久婷婷综合_中| 久久久久久久中文| 亚洲蜜臀av乱码久久精品| 青青草免费在线视频| 日韩美一区二区三区| 日韩欧美激情| 5566中文字幕一区二区| 日韩激情一二三区| 欧美精品成人网| 色婷婷国产精品| 亚洲同志男男gay1069网站| 国产最新精品视频| 亚洲黄色视屏| 国产免费黄视频| 91福利视频久久久久| 神马久久资源| 国产成人精品网站| 蜜臀av一区二区| 成年人黄色电影| 欧美电影免费提供在线观看| 亚洲国产中文在线| 精品午夜一区二区| 久久久久久久久久看片| 欧美日韩伦理片| 少妇精69xxtheporn| 亚洲国产精品久久久天堂 | 国产影视精品一区二区三区| 国新精品乱码一区二区三区18| 国产精品一品视频| 肉丝一区二区| 久久综合久久八八| 日韩视频在线一区二区三区| 无码人妻精品一区二区三区66| 日韩一卡二卡三卡四卡| 卡通动漫国产精品| 在线观看成人免费| 欧美在线你懂得| 老司机凹凸av亚洲导航| 亚洲乱码一区二区三区三上悠亚| 亚洲欧美电影一区二区| 悠悠资源网亚洲青| 国内视频一区| 亚洲一区二区三区在线看| 一区二区三区短视频| 国产欧美一区二区三区久久| 国产成人免费xxxxxxxx| 青青免费在线视频| 久久久久久久亚洲精品| 精品一区二区综合| av片在线看| 国产精品国产福利国产秒拍| 国产不卡视频在线观看| h视频在线免费| 国产精品电影网| 久久久91精品国产一区二区三区| 四虎影院观看视频在线观看| 国产精品欧美一区二区| www.亚洲在线| 在线观看网站免费入口在线观看国内 | 日韩区在线观看| 久久国产电影| 成人免费视频网站在线看| 精品一区二区电影| 亚洲综合国产激情另类一区| 黄动漫在线免费观看| 欧美激情中文网| 96av麻豆蜜桃一区二区| 涩涩网在线视频| 一区二区三区欧美在线| 欧美日韩mp4| 欧美另类综合| 亚洲人av在线| 成人观看高清在线观看免费| 一区二区三区四区激情| 精品国产乱子伦一区二区| 精品久久久久久无码中文野结衣| 欧美一级精品在线| 午夜亚洲伦理| 二区三区在线观看| 蜜桃av噜噜一区二区三| 欧美日韩国产高清一区| 欧美国产高清| 成年人视频在线观看免费| 亚洲一区久久久| 欧美性感一区二区三区| 亚洲私拍自拍| 3d成人动漫在线| 欧美在线视频一区二区三区| 欧美色电影在线| 99精品视频网| 日本福利专区在线观看| 鲁丝片一区二区三区| 日韩精品一区二区三区视频在线观看 | 激情网站五月天| 欧美大片网站在线观看| 久久精品一级爱片| 欧美爱爱网站| 中文字幕视频在线观看| 国产99在线免费| 亚洲第一区第二区| 成人小视频在线观看| 亚洲1区在线观看| 日本1区2区| 国产91aaa| 日韩成人av在线| 成人黄色综合网站| 黑人久久a级毛片免费观看| 粉嫩欧美一区二区三区| 成人在线看片| 亚洲大胆人体在线| 91丨九色丨黑人外教| 国产传媒欧美日韩成人精品大片| 你懂的在线免费观看| 亚洲欧美丝袜| 九九热视频这里只有精品| 一区二区三区美女| 麻豆成人精品| 亚洲图色一区二区三区| 中文字幕不卡| 日韩精品国内| 九九热这里只有在线精品视| 亚洲成av人在线观看| 日韩黄色在线观看| 亚洲免费一区三区| av免费在线一区二区三区| 菠萝蜜视频在线观看入口| 91精品国产99| 91精品婷婷国产综合久久竹菊| 99精品视频一区二区三区| 欧美一级精品| 97成人资源| 亚洲精品a级片| 精品国产一区二区三区小蝌蚪 | 精品日韩av一区二区| 免费看日韩精品| 视频一区在线| 国产永久av在线| 亚洲国产精品无码观看久久| 国产999在线| 亚洲电影av在线| 亚洲激情六月丁香| 精品一区二区三区不卡| 神马电影久久| 在线天堂中文资源最新版| 粉嫩欧美一区二区三区|