亚州天堂爱爱,做爱视频国产全过程在线观看,成人试看30分钟免费视频,女人无遮挡裸交性做爰视频网站

? ? ?

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

來源:https://mp.weixin.qq.com/s/TJwh1YrUmEDRCwYHcXl3Vg

有很多讀者都希望我出一些詳細(xì)介紹 Java 實戰(zhàn)類項目的文章,畢竟項目實戰(zhàn)經(jīng)驗還是挺重要的,不論是對于找工作還是提高個人工程能力。我自己也發(fā)現(xiàn)很多讀者不怎么會學(xué)習(xí)開源項目,不知道如何把開源項目的一些精華為自己所用。

我們這里分析的是 eladmin[1] 這個基于 Spring Boot Spring Security JPA Vue 的前后端分離的后臺管理系統(tǒng)。

薦過這個項目。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

后臺首頁

開源工具庫

這部分簡單分析一下項目使用到的一些比較有用的開源工具庫:MapStruct(Java 對象映射框架)OSHI(基于 JNA 的操作系統(tǒng)和硬件信息庫)、Hutool(Java 工具類庫)

MapStruct

MapStruct[2] 不僅能夠在 bean 之間復(fù)制屬性,還能夠在不同類型之間自動轉(zhuǎn)換。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

相比于其他常見的映射框架, Dozer、Orika、ModelMapper、JMapper,MapStruct 的性能更好。

OSHI

OSHI[5] 是一款為 Java 語言提供的基于 JNA 的(本機(jī))操作系統(tǒng)和硬件信息庫。

通過 OSHI ,我們不需要安裝任何其他本機(jī)庫,就能查看內(nèi)存和 CPU 使用率、磁盤和分區(qū)使用情況、設(shè)備、傳感器等信息。

OSHI 旨在提供一種跨平臺的實現(xiàn)來檢索系統(tǒng)信息,支持 Windows、Linux、MacOS、Unix 等主流操作系統(tǒng)。

使用 oshi 你可以輕松制作出項目常用的系統(tǒng)監(jiān)控功能,如下圖所示:

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

Hutool

Hutool[6] 一個非常實用的 Java 工具類庫,對文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML 等 JDK 方法進(jìn)行了封裝。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

小技巧

這部分內(nèi)容會簡單分析一下從這個開源項目中看到的一些亮點以及小技巧。

優(yōu)化表命名

根據(jù)項目不同的 Module 作為表名的前綴,這樣看起來更加直觀。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

巧用 AOP 簡化代碼

AOP(Aspect-Oriented Programming:面向切面編程) 能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(例如事務(wù)處理、日志管理、權(quán)限控制等)封裝起來,便于減少系統(tǒng)的重復(fù)代碼降低模塊間的耦合度,提高系統(tǒng)可拓展性和可維護(hù)性。

這個項目中就大量使用了 AOP 思想。簡單舉兩個例子吧!

日志記錄

利用 AOP 方式記錄日志,只需要在 controller 的方法上使用 @Log("") 注解,就可以將用戶操作記錄到數(shù)據(jù)庫,源碼可查看 eladmin-logging這個 Module。。

@Log("新增用戶")@PostMapping(value = "/users")public ResponseEntity create(@Validated @RequestBody User resources){    checkLevel(resources);    return new ResponseEntity(userService.create(resources),HttpStatus.CREATED);}

Redis 限流

利用 AOP 方式對接口進(jìn)行限流,只需要在 controller 的方法上使用@Limit("") 注解即可,源碼可查看 eladmin-common這個 Module。

/** * 測試限流注解,下面配置說明該接口 60秒內(nèi)最多只能訪問 10次,保存到redis的鍵名為 limit_test, */@AnonymousGetMapping@ApiOperation("測試")@Limit(key = "test", period = 60, count = 10, name = "testLimit", prefix = "limit")public int test() {     return ATOMIC_INTEGER.incrementAndGet();}

基于 RBAC 的權(quán)限模塊設(shè)計

系統(tǒng)權(quán)限控制采用 RBAC 基于角色的權(quán)限訪問控制(Role-Based Access Control) 思想(一種最常見的權(quán)限管理思想,在一些對于全權(quán)限控制要求比較嚴(yán)格的系統(tǒng)會使用到)。

什么是 RBAC 呢?

簡單地說:一個用戶可以擁有若干角色,每一個角色有可以被分配若干權(quán)限這樣,就構(gòu)造成“用戶-角色-權(quán)限” 的授權(quán)模型。在這種模型中,用戶與角色、角色與權(quán)限之間構(gòu)成了多對多的關(guān)系,如下圖

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

RBAC

在 RBAC 中,權(quán)限與角色相關(guān)聯(lián),用戶通過成為適當(dāng)角色的成員而得到這些角色的權(quán)限。這就極大地簡化了權(quán)限的管理。

本系統(tǒng)的權(quán)限設(shè)計相關(guān)的表如下(一共 5 張表,2 張用戶建立表之間的聯(lián)系):

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

通過這個權(quán)限模型,我們可以創(chuàng)建不同的角色并為不同的角色分配不同的權(quán)限范圍(菜單)。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

自定義權(quán)限驗證方式

Spring Security 提供了Spring EL表達(dá)式,允許我們在定義接口的方法上面添加注解來實現(xiàn)權(quán)限控制。比如下面的接口表示用戶擁有 admin、menu:edit 權(quán)限中的任意一個就能能訪問update接口。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

但是,由于每個接口都需要給超級管理員放行,所以單純使用這種注解的方式每次都需要重復(fù)的添加 admin 權(quán)限、

因此我們可以加入自定義權(quán)限驗證方式,在驗證的時候默認(rèn)給擁有 admin 權(quán)限的用戶放行。

源碼:

// eladmin-common -> me.zhengjie.config.ElPermissionConfig@Service(value = "el")public class ElPermissionConfig {    public Boolean check(String ...permissions){        // 獲取當(dāng)前用戶的所有權(quán)限        List<String> elPermissions = SecurityUtils.getCurrentUser().getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());        // 判斷當(dāng)前用戶的所有權(quán)限是否包含接口上定義的權(quán)限        return elPermissions.contains("admin") || Arrays.stream(permissions).anyMatch(elPermissions::contains);    }}

使用方式:

@ApiOperation("查詢?nèi)蝿?wù)執(zhí)行日志")@GetMapping(value = "/logs")@PreAuthorize("@el.check('timing:list')")public ResponseEntity<Object> queryJobLog(JobQueryCriteria criteria, Pageable pageable){    return new ResponseEntity<>(quartzJobService.queryAllLog(criteria,pageable), HttpStatus.OK);}

對應(yīng)的數(shù)據(jù)庫內(nèi)容如下:

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

審計功能

在這個項目中,繼承了 BaseEntity 的類會自動寫入創(chuàng)建時間、修改時間、創(chuàng)建人、更新人這些數(shù)據(jù)。

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

簡單介紹一下上面涉及到的一些注解:

  1. @CreationTimestamp : 創(chuàng)建對象的時候自動生成時間戳。
  2. @UpdateTimestamp:創(chuàng)建對象的時候自動生成時間戳。
  3. @CreatedBy :表示該字段為創(chuàng)建人,在這個實體被 insert 的時候會設(shè)置值,@LastModifiedBy同理。

審計功能對應(yīng)的配置類:

SpringBoot前后端分離后臺管理系統(tǒng)分析,真香(springboot springsecurity前后端分離)

可優(yōu)化點

  1. 可以考慮使用阿里開源的 easyexcel 來做 Excel 的導(dǎo)入導(dǎo)出,避免 OOM。
  2. 可以參考 《實際項目中我們是這樣做異常處理的》[7] 對項目全局異常處理部分進(jìn)行優(yōu)化。
  3. 一些重復(fù)代碼可以抽取出來,比如eladmin-common 模塊中的 BaseDTO.javaBaseEntity.javatoString()方法。
  4. 項目的 json 解析庫用到了 fastjson。實際上,我更推薦使用 Spring 默認(rèn)的 JSON 解析庫 Jackson。這兩者中, Fastjson 的代碼質(zhì)量以及設(shè)計更差,并且,經(jīng)常被爆出有安全漏洞(設(shè)計問題)。雖然 Fastjson 在速度方面稍稍取勝,但是,速度方面的優(yōu)勢不太明顯,影響不大。
  5. 可以使用 Caffeine 來做本地緩存。

后記

我發(fā)現(xiàn)很多人對于開源項目的態(tài)度就是:克隆下來就簡單玩玩功能就算了。

我覺得這樣不太好。你把項目克隆下來之后,首先肯定是自己體驗一下系統(tǒng)的核心功能。體驗了核心功能之后,你可以分析分析項目代碼,檢查一下有沒有 bug,看看有沒有可以優(yōu)化的代碼/模塊,思考一下有沒有需要完善的功能模塊……。我在自己分析、調(diào)試這個開源項目的時候,就發(fā)現(xiàn)了一個小 bug 并提交了相應(yīng)的 issue (目前已經(jīng)被采納)。

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。

(0)
上一篇 2023年7月31日 上午9:13
下一篇 2023年7月31日 上午9:29

相關(guān)推薦