日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久色91| 欧美黄色高清视频 | 182tv午夜福利在线观看 | 欧美va亚洲va| 国产第七页 | 黑人狂躁日本妞hd | 亚洲婷婷综合网 | 日韩一区二区三区免费在线观看 | 天堂а在线中文在线新版 | 视频一二三区 | 国产精品精品久久久久久 | 无码人妻丰满熟妇精品 | 亚洲av女人18毛片水真多 | 伊人久久大香线蕉成人综合网 | 91黄址| 四虎成人精品在永久免费 | 先锋影音一区二区 | 亚洲综合一区二区三区 | 人操人视频 | 九九综合九九 | 在线观看中文字幕亚洲 | 日本免费网站在线观看 | 免费的黄色片 | 在线观看免费日韩av | 六月丁香激情网 | 69re视频 | 95国产精品 | 制服丝袜在线第一页 | 床戏高潮呻吟声片段 | 99久久影院 | 午夜色图 | 国产51视频| 国产日韩欧美在线观看 | 国产另类专区 | 日韩五码在线 | 黄色在线观看视频网站 | 成人资源在线观看 | 五月六月丁香 | 亚洲五月六月 | 中文字幕不卡在线播放 | 色吟av| 草草影院第一页yycc.com | 夜夜小视频 | 国产精品自拍亚洲 | 午夜免费激情视频 | 日韩大片免费在线观看 | 黄色在线免费观看网站 | 日韩av免费在线播放 | 亚洲天堂成人在线 | 欧美成人精品一区二区免费看片 | 91午夜理伦私人影院 | 国产精品国产精品国产专区不卡 | 亚洲香蕉视频 | 中文字幕人妻精品一区 | 女仆裸体打屁屁羞羞免费 | 午夜寂寞影院在线观看 | 波多野结衣大片 | 欧美性猛交aaaa片黑人 | 手机看片福利永久 | 美妇湿透娇羞紧窄迎合 | 西欧free性满足hd老熟妇 | 精品视频一区二区三区 | 午夜av剧场 | 日本阿v视频 | 天天操天天干天天 | 色播欧美 | 国产一区二区在线免费观看 | 在线视频www | 久久久青青 | 美女91网站| 高清一区二区 | 国产成a人亚洲精v品在线观看 | 四虎永久在线 | 国产成人av一区二区三区 | 天天天天 | 久久6视频 | 伊人99热 | 久久99精品波多结衣一区 | 欧美日韩视频一区二区三区 | 日韩欧美xxxx | 性欧美一区二区 | 日本在线观看一区二区三区 | 男人添女人下部高潮全视频 | 日本va视频 | 黑人激情视频 | 黄片毛片在线 | 日韩精品av一区二区三区 | 中国极品少妇xxxxx | 久久97精品久久久久久久不卡 | 激情亚洲 | 亚洲 欧美 日韩 综合 | 日韩黄片一区二区 | 卡通动漫精品一区二区三区 | 荫蒂被男人添免费视频 | 国产精品影音先锋 | 一级全黄裸体片 | 欧美xxxxxxxxx | 怡红院成人av | 国产成人在线一区二区 |