日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!

發(fā)布時(shí)間:2025/3/16 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?在我們做SpringBoot項(xiàng)目的時(shí)候,認(rèn)證授權(quán)是必不可少的功能!我們經(jīng)常會(huì)選擇Shiro、Spring Security這類權(quán)限認(rèn)證框架來實(shí)現(xiàn),但這些框架使用起來有點(diǎn)繁瑣,而且功能也不夠強(qiáng)大。最近發(fā)現(xiàn)一款功能強(qiáng)大的權(quán)限認(rèn)證框架Sa-Token,它使用簡單、API設(shè)計(jì)優(yōu)雅,推薦給大家!

?

Sa-Token簡介

Sa-Token是一款輕量級(jí)的Java權(quán)限認(rèn)證框架,可以用來解決登錄認(rèn)證、權(quán)限認(rèn)證、Session會(huì)話、單點(diǎn)登錄、OAuth2.0、微服務(wù)網(wǎng)關(guān)鑒權(quán)等一系列權(quán)限相關(guān)問題。

框架集成簡單、開箱即用、API設(shè)計(jì)優(yōu)雅,通過Sa-Token,你將以一種極其簡單的方式實(shí)現(xiàn)系統(tǒng)的權(quán)限認(rèn)證部分,有時(shí)候往往只需一行代碼就能實(shí)現(xiàn)功能。

Sa-Token功能很全,具體可以參考下圖。

?

使用

在SpringBoot中使用Sa-Token是非常簡單的,接下來我們使用它來實(shí)現(xiàn)最常用的認(rèn)證授權(quán)功能,包括登錄認(rèn)證、角色認(rèn)證和權(quán)限認(rèn)證。

集成及配置

Sa-Token的集成和配置都非常簡單,不愧為開箱即用。

  • 首先我們需要在項(xiàng)目的pom.xml中添加Sa-Token的相關(guān)依賴;

<!--?Sa-Token?權(quán)限認(rèn)證?--> <dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.24.0</version> </dependency>
  • 然后在application.yml中添加Sa-Token的相關(guān)配置,考慮到要支持前后端分離項(xiàng)目,我們關(guān)閉從cookie中讀取token,改為從head中讀取token。

#?Sa-Token配置 sa-token:#?token名稱?(同時(shí)也是cookie名稱)token-name:?Authorization#?token有效期,單位秒,-1代表永不過期timeout:?2592000#?token臨時(shí)有效期?(指定時(shí)間內(nèi)無操作就視為token過期),單位秒activity-timeout:?-1#?是否允許同一賬號(hào)并發(fā)登錄?(為false時(shí)新登錄擠掉舊登錄)is-concurrent:?true#?在多人登錄同一賬號(hào)時(shí),是否共用一個(gè)token?(為false時(shí)每次登錄新建一個(gè)token)is-share:?false#?token風(fēng)格token-style:?uuid#?是否輸出操作日志is-log:?false#?是否從cookie中讀取tokenis-read-cookie:?false#?是否從head中讀取tokenis-read-head:?true

登錄認(rèn)證

在管理系統(tǒng)中,除了登錄接口,基本都需要登錄認(rèn)證,在Sa-Token中使用路由攔截鑒權(quán)是最方便的,下面我們來實(shí)現(xiàn)下。

  • 實(shí)現(xiàn)登錄認(rèn)證非常簡單,首先在UmsAdminController中添加一個(gè)登錄接口;

/***?后臺(tái)用戶管理*?Created?by?macro?on?2018/4/26.*/ @Controller @Api(tags?=?"UmsAdminController",?description?=?"后臺(tái)用戶管理") @RequestMapping("/admin") public?class?UmsAdminController?{@Autowiredprivate?UmsAdminService?adminService;@ApiOperation(value?=?"登錄以后返回token")@RequestMapping(value?=?"/login",?method?=?RequestMethod.POST)@ResponseBodypublic?CommonResult?login(@RequestParam?String?username,?@RequestParam?String?password)?{SaTokenInfo?saTokenInfo?=?adminService.login(username,?password);if?(saTokenInfo?==?null)?{return?CommonResult.validateFailed("用戶名或密碼錯(cuò)誤");}Map<String,?String>?tokenMap?=?new?HashMap<>();tokenMap.put("token",?saTokenInfo.getTokenValue());tokenMap.put("tokenHead",?saTokenInfo.getTokenName());return?CommonResult.success(tokenMap);} }
  • 然后在UmsAdminServiceImpl添加登錄的具體邏輯,先驗(yàn)證密碼,然后調(diào)用StpUtil.login(adminUser.getId())即可實(shí)現(xiàn)登錄,調(diào)用API一行搞定;

/***?Created?by?macro?on?2020/10/15.*/ @Slf4j @Service public?class?UmsAdminServiceImpl?implements?UmsAdminService?{@Overridepublic?SaTokenInfo?login(String?username,?String?password)?{SaTokenInfo?saTokenInfo?=?null;AdminUser?adminUser?=?getAdminByUsername(username);if?(adminUser?==?null)?{return?null;}if?(!SaSecureUtil.md5(password).equals(adminUser.getPassword()))?{return?null;}//?密碼校驗(yàn)成功后登錄,一行代碼實(shí)現(xiàn)登錄StpUtil.login(adminUser.getId());//?獲取當(dāng)前登錄用戶Token信息saTokenInfo?=?StpUtil.getTokenInfo();return?saTokenInfo;} }
  • 我們?cè)偬砑右粋€(gè)測試接口用于查詢當(dāng)前登錄狀態(tài),返回true表示已經(jīng)登錄;

/***?Created?by?macro?on?2020/10/15.*/ @Slf4j @Service public?class?UmsAdminServiceImpl?implements?UmsAdminService?{@ApiOperation(value?=?"查詢當(dāng)前登錄狀態(tài)")@RequestMapping(value?=?"/isLogin",?method?=?RequestMethod.GET)@ResponseBodypublic?CommonResult?isLogin()?{return?CommonResult.success(StpUtil.isLogin());} }
  • 之后可以通過Swagger訪問登錄接口來獲取Token了,使用賬號(hào)為admin:123456,訪問地址:http://localhost:8088/swagger-ui/

  • 然后在Authorization請(qǐng)求頭中添加獲取到的token;

  • 訪問/admin/isLogin接口,data屬性就會(huì)返回true了,表示你已經(jīng)是登錄狀態(tài)了;

  • 接下來我們需要把除登錄接口以外的接口都添加登錄認(rèn)證,添加Sa-Token的Java配置類SaTokenConfig,注冊(cè)一個(gè)路由攔截器SaRouteInterceptor,這里我們的IgnoreUrlsConfig配置會(huì)從配置文件中讀取白名單配置;

/***?Sa-Token相關(guān)配置*/ @Configuration public?class?SaTokenConfig?implements?WebMvcConfigurer?{@Autowiredprivate?IgnoreUrlsConfig?ignoreUrlsConfig;/***?注冊(cè)sa-token攔截器*/@Overridepublic?void?addInterceptors(InterceptorRegistry?registry)?{registry.addInterceptor(new?SaRouteInterceptor((req,?resp,?handler)?->?{//?獲取配置文件中的白名單路徑List<String>?ignoreUrls?=?ignoreUrlsConfig.getUrls();//?登錄認(rèn)證:除白名單路徑外均需要登錄認(rèn)證SaRouter.match(Collections.singletonList("/**"),?ignoreUrls,?StpUtil::checkLogin);})).addPathPatterns("/**");} }
  • application.yml文件中的白名單配置如下,注意開放Swagger的訪問路徑和靜態(tài)資源路徑;

#?訪問白名單路徑 secure:ignored:urls:-?/-?/swagger-ui/-?/*.html-?/favicon.ico-?/**/*.html-?/**/*.css-?/**/*.js-?/swagger-resources/**-?/v2/api-docs/**-?/actuator/**-?/admin/login-?/admin/isLogin
  • 由于未登錄狀態(tài)下訪問接口,Sa-Token會(huì)拋出NotLoginException異常,所以我們需要全局處理下;

/***?全局異常處理*?Created?by?macro?on?2020/2/27.*/ @ControllerAdvice public?class?GlobalExceptionHandler?{/***?處理未登錄的異常*/@ResponseBody@ExceptionHandler(value?=?NotLoginException.class)public?CommonResult?handleNotLoginException(NotLoginException?e)?{return?CommonResult.unauthorized(e.getMessage());} }
  • 之后當(dāng)我們?cè)诘卿洜顟B(tài)下訪問接口時(shí),可以獲取到數(shù)據(jù);

  • 當(dāng)我們未登錄狀態(tài)(不帶token)時(shí)無法正常訪問接口,返回code為401。

角色認(rèn)證

角色認(rèn)證也就是我們定義好一套規(guī)則,比如ROLE-ADMIN角色可以訪問/brand下的所有資源,而ROLE_USER角色只能訪問/brand/listAll,接下來我們來實(shí)現(xiàn)下角色認(rèn)證。

  • 首先我們需要擴(kuò)展Sa-Token的StpInterface接口,通過實(shí)現(xiàn)方法來返回用戶的角色碼和權(quán)限碼;

/***?自定義權(quán)限驗(yàn)證接口擴(kuò)展*/ @Component public?class?StpInterfaceImpl?implements?StpInterface?{@Autowiredprivate?UmsAdminService?adminService;@Overridepublic?List<String>?getPermissionList(Object?loginId,?String?loginType)?{AdminUser?adminUser?=?adminService.getAdminById(Convert.toLong(loginId));return?adminUser.getRole().getPermissionList();}@Overridepublic?List<String>?getRoleList(Object?loginId,?String?loginType)?{AdminUser?adminUser?=?adminService.getAdminById(Convert.toLong(loginId));return?Collections.singletonList(adminUser.getRole().getName());} }
  • 然后在Sa-Token的攔截器中配置路由規(guī)則,ROLE_ADMIN角色可以訪問所有路徑,而ROLE_USER只能訪問/brand/listAll路徑;

/***?Sa-Token相關(guān)配置*/ @Configuration public?class?SaTokenConfig?implements?WebMvcConfigurer?{@Autowiredprivate?IgnoreUrlsConfig?ignoreUrlsConfig;/***?注冊(cè)sa-token攔截器*/@Overridepublic?void?addInterceptors(InterceptorRegistry?registry)?{registry.addInterceptor(new?SaRouteInterceptor((req,?resp,?handler)?->?{//?獲取配置文件中的白名單路徑List<String>?ignoreUrls?=?ignoreUrlsConfig.getUrls();//?登錄認(rèn)證:除白名單路徑外均需要登錄認(rèn)證SaRouter.match(Collections.singletonList("/**"),?ignoreUrls,?StpUtil::checkLogin);//?角色認(rèn)證:ROLE_ADMIN可以訪問所有接口,ROLE_USER只能訪問查詢?nèi)拷涌赟aRouter.match("/brand/listAll",?()?->?{StpUtil.checkRoleOr("ROLE_ADMIN","ROLE_USER");//強(qiáng)制退出匹配鏈SaRouter.stop();});SaRouter.match("/brand/**",?()?->?StpUtil.checkRole("ROLE_ADMIN"));})).addPathPatterns("/**");} }
  • 當(dāng)用戶不是被允許的角色訪問時(shí),Sa-Token會(huì)拋出NotRoleException異常,我們可以全局處理下;

/***?全局異常處理*?Created?by?macro?on?2020/2/27.*/ @ControllerAdvice public?class?GlobalExceptionHandler?{/***?處理沒有角色的異常*/@ResponseBody@ExceptionHandler(value?=?NotRoleException.class)public?CommonResult?handleNotRoleException(NotRoleException?e)?{return?CommonResult.forbidden(e.getMessage());} }
  • 我們現(xiàn)在有兩個(gè)用戶,admin用戶具有ROLE_ADMIN角色,macro用戶具有ROLE_USER角色;

  • 使用admin賬號(hào)訪問/brand/list接口可以正常訪問;

  • 使用macro賬號(hào)訪問/brand/list接口無法正常訪問,返回code為403。

權(quán)限認(rèn)證

當(dāng)我們給角色分配好權(quán)限,然后給用戶分配好角色后,用戶就擁有了這些權(quán)限。我們可以為每個(gè)接口分配不同的權(quán)限,擁有該權(quán)限的用戶就可以訪問該接口。這就是權(quán)限認(rèn)證,接下來我們來實(shí)現(xiàn)下它。

  • 我們可以在Sa-Token的攔截器中配置路由規(guī)則,admin用戶可以訪問所有路徑,而macro用戶只有讀取的權(quán)限,沒有寫、改、刪的權(quán)限;

/***?Sa-Token相關(guān)配置*/ @Configuration public?class?SaTokenConfig?implements?WebMvcConfigurer?{@Autowiredprivate?IgnoreUrlsConfig?ignoreUrlsConfig;/***?注冊(cè)sa-token攔截器*/@Overridepublic?void?addInterceptors(InterceptorRegistry?registry)?{registry.addInterceptor(new?SaRouteInterceptor((req,?resp,?handler)?->?{//?獲取配置文件中的白名單路徑List<String>?ignoreUrls?=?ignoreUrlsConfig.getUrls();//?登錄認(rèn)證:除白名單路徑外均需要登錄認(rèn)證SaRouter.match(Collections.singletonList("/**"),?ignoreUrls,?StpUtil::checkLogin);//?權(quán)限認(rèn)證:不同接口, 校驗(yàn)不同權(quán)限SaRouter.match("/brand/listAll",?()?->?StpUtil.checkPermission("brand:read"));SaRouter.match("/brand/create",?()?->?StpUtil.checkPermission("brand:create"));SaRouter.match("/brand/update/{id}",?()?->?StpUtil.checkPermission("brand:update"));SaRouter.match("/brand/delete/{id}",?()?->?StpUtil.checkPermission("brand:delete"));SaRouter.match("/brand/list",?()?->?StpUtil.checkPermission("brand:read"));SaRouter.match("/brand/{id}",?()?->?StpUtil.checkPermission("brand:read"));})).addPathPatterns("/**");} }
  • 當(dāng)用戶無權(quán)限訪問時(shí),Sa-Token會(huì)拋出NotPermissionException異常,我們可以全局處理下;

/***?全局異常處理*?Created?by?macro?on?2020/2/27.*/ @ControllerAdvice public?class?GlobalExceptionHandler?{/***?處理沒有權(quán)限的異常*/@ResponseBody@ExceptionHandler(value?=?NotPermissionException.class)public?CommonResult?handleNotPermissionException(NotPermissionException?e)?{return?CommonResult.forbidden(e.getMessage());} }
  • 使用admin賬號(hào)訪問/brand/delete接口可以正常訪問;

  • 使用macro賬號(hào)訪問/brand/delete無法正常訪問,返回code為403。

?

總結(jié)

通過對(duì)Sa-Token的一波實(shí)踐,我們可以發(fā)現(xiàn)它的API設(shè)計(jì)非常優(yōu)雅,比起Shiro和Spring Security來說確實(shí)順手多了。Sa-Token不僅提供了一系列強(qiáng)大的權(quán)限相關(guān)功能,還提供了很多標(biāo)準(zhǔn)的解決方案,比如Oauth2、分布式Session會(huì)話等,大家感興趣的話可以研究下。

?

參考資料

Sa-Token的官方文檔很全,也很良心,不僅提供了解決方式,還提供了解決思路,強(qiáng)烈建議大家去看下。

官方文檔:http://sa-token.dev33.cn/

有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號(hào)

好文章,我在看??

?

?

總結(jié)

以上是生活随笔為你收集整理的再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人自拍 | 国产高清视频在线观看 | 都市激情av | 国产专区在线 | 在线免费观看黄 | 欧美天天视频 | 粉嫩av蜜桃av蜜臀av | 无码熟妇αⅴ人妻又粗又大 | 日日日日日日bbbbbb | 亚洲av永久无码精品放毛片 | 成人av高清 | 高清一区二区 | 黄在线免费 | 日韩永久免费视频 | 一级全黄裸体免费观看视频 | 波多野结衣久久精品 | 小草av在线| 99国产精品白浆在线观看免费 | 色多多污污| 亚洲免费国产视频 | 欧美亚洲天堂网 | 日韩爱爱爱 | 蜜桃视频一区二区在线观看 | 日韩精品免费一区二区在线观看 | 人妻一区二区三 | 国产夫妻自拍小视频 | 亚洲高清视频在线 | 国产一毛片| 亚洲欧美日韩在线一区二区 | 国产午夜毛片 | 狠狠夜夜 | 在线播放的av| 自拍欧美亚洲 | 日韩欧美成人精品 | 蜜臀久久99精品久久一区二区 | 亚洲情区 | 久久精品无码一区二区三区毛片 | 国产野外作爱视频播放 | 欧美粉嫩videosex极品 | 天堂网色 | 在线成人观看 | 羞羞的视频在线观看 | 无码人妻丰满熟妇啪啪欧美 | 日韩网站在线播放 | 欧美性jizz18性欧美 | 色狗网站 | 日韩和一区二区 | 色老大网站| 日韩av免费在线播放 | 五月天青青草 | 国产精品二区一区 | 国产欧美日韩激情 | 天天插天天狠天天透 | 日日操夜夜骑 | 国产刺激视频 | 91蜜桃网 | 亚洲AV无码一区二区三区少妇 | 一二三毛片 | 日韩激情久久 | 成人黄色片免费看 | 亚州a级片 | 日本高清视频在线播放 | 国产精品普通话 | 欧美日韩激情在线一区二区三区 | 亚洲精品乱码久久久久久蜜桃欧美 | 日韩精品一区二区三区免费视频 | 国内精品久久久久久久 | 男女无遮挡网站 | 欧美亚洲另类在线 | 福利亚洲| 日本黄视频在线观看 | 免费看又黄又无码的网站 | 一本久道视频一本久道 | 免费特级黄色片 | av电影一区二区三区 | 色窝av| 成人免费版 | 亚洲两性视频 | 性日本xxx | 少妇一级淫片免费看 | 亚洲精品88 | 欧美a一级 | 东京热一区二区三区四区 | 久久久精品在线观看 | 欧洲一区二区三区在线 | 秋霞在线视频 | 性高潮免费视频 | 在线色 | 日本免费a视频 | 久久久久久福利 | 日韩av不卡在线 | 香蕉视频成人在线观看 | 中国老熟妇自拍hd发布 | 久草福利资源在线 | 亚洲综合色婷婷 | 2024国产精品视频 | 久久久久国产一区二区 | 男人深夜影院 | 16一17女人毛片 |