成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

想要控制好權限,這八個注解必須知道!

開發 前端
本篇文章介紹了Spring Security 中內置的8個權限注解以及碼猿慢病云管理系統中的實踐,這個權限注解的使用是必須將權限下放到微服務鑒權才能用到,如果你的系統是在網關處統一鑒權則用不到。

在碼猿慢病云管理系統采用的是Spring Cloud 集成Spring Security OAuth2的方式實現認證、鑒權,其中涉及到的一個重要問題則是數據權限的過濾,今天就來介紹一下實現的方案。

在之前的文章中曾經介紹過通過自定義的三個注解 @RequiresLogin、 @RequiresPermissions 、 @RequiresRoles 實現微服務的鑒權其實就是參考Spring Security 內置的注解實現,有想要了解的請看:3 個注解,優雅的實現微服務鑒權

在介紹數據權限之前,先來看下Spring Security 中內置的8個權限注解,只有理解了這8個注解,對于理解碼猿慢病云管理系統中的實現方案就非常easy了。

Spring Security 內置的權限注解是將鑒權下放到各個微服務,想要了解在網關處統一鑒權處理的請看之前分享的文章:實戰干貨!Spring Cloud Gateway 整合 OAuth2.0 實現分布式統一認證授權!

Spring Security 中的權限注解

Spring Security 中支持多種數據權限注解,若想使用內置的注解,首先需要通過@EnableGlobalMethodSecurity這個注解開啟權限注解的支持,代碼如下:

/**
 * @author 公眾號:碼猿技術專欄
 * 自定義資源服務注解
 * {@link com.code.ape.codeape.common.security.annotation.EnableCodeapeResourceServer}
 */
@Documented
@Inherited
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import({ CodeapeResourceServerAutoConfiguration.class, CodeapeResourceServerConfiguration.class })
public @interface EnableCodeapeResourceServer {}

在碼猿慢病云管理系統中是將Spring Security集成為一個Spring Boot Starter,因此需要一個直接開啟對于Spring Security的支持,EnableCodeapeResourceServer是自定義的資源服務注解,便于一鍵導入資源服務配置,只要是資源服務,只需要在資源服務配置類上添加這個注解即可。

比如設備服務(codeape-device-biz)的啟動類如下:

圖片圖片

如果是直接集成Spring Security ,那么直接在配置類標注@EnableGlobalMethodSecurity這個注解也是一樣效果,代碼如下:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

@EnableGlobalMethodSecurity注解的三個屬性如下:

  • prePostEnabled:設置為true,將會開啟 Spring Security 提供的四個權限注解,@PostAuthorize、@PostFilter、@PreAuthorize 以及 @PreFilter,這四個注解支持權限表達式,支持 SpEL,功能比較豐富。
  • securedEnabled:設置為true,將會開啟 Spring Security 提供的 @Secured 注解,該注解不支持權限表達式。
  • jsr250Enabled:設置為true,將會開啟 JSR-250 提供的注解,主要包括 @DenyAll、@PermitAll 以及 @RolesAllowed 三個注解,這些注解也不支持權限表達式。

以上的8個注解總結如下:

  1. @PostAuthorize:在目標方法執行之后進行權限校驗。
  2. @PostFilter:在目標方法執行之后對方法的返回結果進行過濾。
  3. @PreAuthorize:在目標方法執行之前進行權限校驗。
  4. @PreFilter:在目標方法執行之前對方法參數進行過濾。
  5. @Secured:訪問目標方法必須具備相應的角色。
  6. @DenyAll:拒絕所有訪問。
  7. @PermitAll:允許所有訪問。
  8. @RolesAllowed:訪問目標方法必須具備相應的角色。

其實在日常開發中使用前四個注解已經完全夠用,且支持靈活的SPEL權限表達式,方便定制。因此只需要設置prePostEnabled = true

權限注解使用

接下來就來簡單介紹一下這8個權限注解的使用。

1. @PreAuthorize

@PreAuthorize這個注解在方法執行之前進行安全校驗,支持SPEL,比如在接口使用代碼如下:

@RestController
@RequestMapping
public class HelloService {
    @PreAuthorize("hasRole('IN_HOS_NURSE')")
    @GetMapping
    public String hello() {
        return "hello";
    }
}

@PreAuthorize("hasRole('IN_HOS_NURSE')")代碼含義則是只有擁有住院護士的角色的用戶才能訪問這個接口。這里用到了hasRole這個權限表達式,表示擁有某個角色

2. @PreFilter

@PreFilter這個注解主要是對參數進行過濾,其中兩個屬性如下:

  • value :SPEL表達式校驗
  • filterTarget:多個參數的情況下,指定對某個參數校驗

使用如下:

@RestController
@RequestMapping
public class HelloService {
    @PreFilter(value = "obj.id!=1",filterTarget = "users")
    @GetMapping
    public String hello(List<Obj> obj,Integer a) {
        return "hello";
    }
}

3. @PostAuthorize

@PostAuthorize是在方法執行之后進行數據校驗,平常所有的數據校驗一般是在方法執行之前,所以一般結合@PreAuthorize使用。

PostAuthorize中內置了一個returnObject返回值,對方法的返回值校驗,使用如下:

@RestController
@RequestMapping
public class HelloService {
    @PostAuthorize(value = "returnObject.id==1")
    @GetMapping
    public Obj hello(List<Obj> obj,Integer a) {
        return "hello";
    }
}

這個接口的返回值的id必須等于1才會通過,否則將會拋出異常。

4. @PostFilter

@PostFilter 注解是在目標方法執行之后,對目標方法的返回結果進行過濾,該注解中包含了一個內置對象 filterObject,表示目標方法返回的集合/數組中的具體元素:

@RestController
@RequestMapping
public class HelloService {
    @PostFilter(value = "filterObject.id==1")
    @GetMapping
    public Obj hello(List<Obj> obj,Integer a) {
        return "hello";
    }
}

5. @Secured

@Secured 注解也是 Spring Security 提供的權限注解,不同于前面四個注解,該注解不支持權限表達式,只能做一些簡單的權限描述。

使用如下:

@RestController
@RequestMapping
public class HelloService {
    @Secured({"ROLE_IN_HOS_NURSE","ROLE_IN_HOS_DOC"})
    @GetMapping
    public Obj hello(List<Obj> obj,Integer a) {
        return "hello";
    }
}

這段代碼表示只有當前用戶擁有住院護士、住院醫生的權限才能訪問這個接口。

@Secured能夠做的,@PreAuthorize也都能做,且給的更多!

6. @DenyAll

@DenyAll 是 JSR-250 提供的方法注解,顧名思義,拒絕所有請求。

@RestController
@RequestMapping
public class HelloService {
    @DenyAll
    @GetMapping
    public String hello() {
        return "hello";
    }
}

7. @PermitAll

@PermitAll 也是 JSR-250 提供的方法注解,顧名思義,允許所有訪問!

@RestController
@RequestMapping
public class HelloService {
    @PermitAll
    @GetMapping
    public String hello() {
        return "hello";
    }
}

8. @RolesAllowed

@RolesAllowed 也是 JSR-250 提供的注解,可以添加在方法上或者類上,當添加在類上時,表示該注解對類中的所有方法生效;如果類上和方法上都有該注解,并且起沖突,則以方法上的注解為準。

@RestController
@RequestMapping
public class HelloService {
    @RolesAllowed({"IN_HOS_NURSE","IN_HOS_DOC"})
    @GetMapping
    public Obj hello(List<Obj> obj,Integer a) {
        return "hello";
    }
}

這段代碼表示只有當前用戶擁有住院護士、住院醫生的權限才能訪問這個接口。

根據上述的介紹,大致理解了這8個注解,實際項目中建議使用@PostAuthorize、@PostFilter、@PreAuthorize 以及 @PreFilter這四個注解,完全夠用了!

慢病云管理系統的實踐

在碼猿慢病云管理系統中使用的權限注解是@PreAuthorize,在接口執行之前對數據權限進行校驗。

比如住院服務codeape-inhos-biz中的分頁查詢住院患者接口如下:

圖片圖片

這里的@PreAuthorize("@pms.hasPermission('inhos_patinfohot_get')" )則是對用戶的權限進行攔截校驗,只有擁有inhos_patinfohot_get權限的用戶才能訪問這個接口。

而這里是直接通過SPEL表達式調用IOC容器中的方法進行攔截校驗,代碼如下:

com.code.ape.codeape.common.security.component.PermissionService#hasPermission

圖片圖片

邏輯很簡單,從SecurityContext中獲取用戶的權限和指定的權限進行比較,校驗通過則返回true。

總結

本篇文章介紹了Spring Security 中內置的8個權限注解以及碼猿慢病云管理系統中的實踐,這個權限注解的使用是必須將權限下放到微服務鑒權才能用到,如果你的系統是在網關處統一鑒權則用不到。

碼猿慢病云管理系統已經在星球中陸續更新,目前更新內容如下:

前言
     01 項目架構+業務介紹
     02 三方組件介紹
     03 服務端項目部署
     04 前端項目部署
     05 多租戶架構設計
     06 醫療系統中的權限如何設計?
     07 項目搭建
     08 關掉驗證碼登錄
     09 開發平臺自動生成業務代碼
認證鑒權
     01 認證登錄生成token
     02 token檢驗、鑒權
     03 token有效期設置
     04 刷新token
     05 檢查token
     06 服務中如何獲取當前登錄用戶信息?
     07 接口對外暴露
     08 接口只允許內部調用怎么處理?
     09 如何實現token中繼?
     10 當前登錄用戶身份信息如何異步傳遞?
     11 科室權限如何定一個注解自動注入?
     12 一個注解防止接口重復提交
     13 8個權限注解玩轉鑒權
業務
     01 科室管理
     02 醫院管理
     03 角色管理
     04 菜單+權限管理

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

2022-05-26 00:33:29

權限TienChin項目

2009-06-25 09:04:22

.NET開發人員

2022-05-31 09:39:40

UI網格設計

2024-09-03 13:24:12

2018-01-16 00:27:59

2025-02-10 10:38:24

2021-07-19 22:40:56

Windows 11Windows微軟

2022-04-07 11:04:31

RocketMQBrokerConsumer

2025-03-17 00:33:00

2022-07-22 16:00:53

GitHub工具安全

2009-09-20 10:11:20

Windows 7系統安裝

2010-06-25 09:18:43

MySQLOracle

2015-07-23 10:37:13

Linux命令

2024-05-13 18:33:08

SQL日期函數

2024-12-10 15:13:28

2017-03-30 10:00:45

AR出版業顛覆

2020-09-09 10:53:06

前端開發工具

2023-12-21 14:43:30

Python字典

2023-12-27 18:10:05

PyTorch工具框架

2020-03-19 15:30:08

JavaScript數組字符串
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99热在线播放 | 国产91网站在线观看 | 91精品无人区卡一卡二卡三 | 91久久国产精品 | 99国内精品久久久久久久 | 色综合天天天天做夜夜夜夜做 | 91国在线高清视频 | 国产精品1| 国产精品观看 | 亚洲精品9999 | 亚洲天堂中文字幕 | 在线伊人| 国内自拍视频在线观看 | 国产精品一区二区久久精品爱微奶 | 欧美精品久久久久久久久久 | 精品国产欧美日韩不卡在线观看 | 女女爱爱视频 | 狠狠色狠狠色综合日日92 | 天天操天天射天天舔 | 国产午夜精品一区二区三区嫩草 | 超级碰在线 | 人妖av| 日韩欧美中文字幕在线视频 | 日韩成人在线观看 | 欧美视频三区 | 91免费看片 | 99精品久久久久 | 精品一区二区三区在线播放 | 亚洲一区二区三区免费 | 97caoporn国产免费人人 | 国产高清性xxxxxxxx | 久久成人免费 | 午夜欧美 | 精品在线播放 | 精品久久精品 | 国产成人精品一区二区三区四区 | 韩国毛片一区二区三区 | 亚洲免费一区 | 日韩成人 | www.狠狠干| 亚洲成人免费视频 |