後端基於方法的許可權控制--Spirng-Security

来源:https://www.cnblogs.com/weir110/archive/2019/08/06/11312598.html
-Advertisement-
Play Games

後端基於方法的許可權控制 Spirng Security 預設情況下, Spring Security 並不啟用方法級的安全管控. 啟用方法級的管控後, 可以針對不同的方法通過註解設置不同的訪問條件;Spring Security 支持三種方法級註解, 分別是 JSR 205/Secured 註解/p ...


後端基於方法的許可權控制--Spirng-Security
預設情況下, Spring Security 並不啟用方法級的安全管控. 啟用方法級的管控後, 可以針對不同的方法通過註解設置不同的訪問條件;Spring Security 支持三種方法級註解, 分別是 JSR-205/Secured 註解/prePostEnabled。

開啟方法級別註解

<global-method-security secured-annotations="enabled" />

<global-method-security jsr250-annotations="enabled" />

<global-method-security pre-post-annotations="enabled" />
//@Secured 註解
@EnableGlobalMethodSecurity(securedEnabled=true)
//JSR-205 註解
@EnableGlobalMethodSecurity(jsr250Enabled=true)
//@PreAuthorize 類型的註解(支持 Spring 表達式)
@EnableGlobalMethodSecurity(prePostEnabled=true)
開始方法級別的註釋使用
  1. Secured
    只有滿足角色的用戶才能訪問被註解的方法, 否則將會拋出 AccessDenied 異常.

    @Secured("ROLE_TELLER","ROLE_ADMIN"), 該方法只允許 ROLE_TELLER 或 ROLE_ADMIN 角色的用戶訪問.
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY"), 該方法允許匿名用戶訪問.

  2. JSR-205

    @DenyAll註解, 拒絕所有的訪問
    @PermitAll 註解, 運行所有訪問
    @RolesAllowed({"USER","ADMIN"}), 該方法只允許有 ROLE_USER 或 ROLE_ADMIN 角色的用戶訪問.

  3. PreAuthorize
    JSR-205 和 Secured 註解功能較弱, 不支持 Spring EL 表達式. 推薦使用 @PreAuthorize 類型的註解.

    @PreAuthorize 註解, 在方法調用之前, 基於表達式結果來限制方法的使用.
    @PostAuthorize 註解, 允許方法調用, 但是如果表達式結果為 false, 將拋出一個安全性異常.
    @PostFilter 註解, 允許方法調用, 但必要按照表達式來過濾方法的結果.
    @PreFilter 註解, 允許方法調用, 但必須在進入方法之前過來輸入值.

詳解PreAuthorize表達式
  1. returnObject 保留名
    對於 @PostAuthorize 和 @PostFilter 註解, 可以在表達式中使用 returnObject 保留名, returnObject 代表著被註解方法的返回值, 我們可以使用 returnObject 保留名對註解方法的結果進行驗證.
    比如:
@PostAuthorize ("returnObject.owner == authentication.name")
public Book getBook();

@PostAuthorize 和 @PostFilter 本身在方法之後使用 ;本身使用場景不多

  1. 表達式中的 # 號
    在表達式中, 可以使用 #argument123 的形式來代表註解方法中的參數 argument123.
    比如:
@PreAuthorize ("#book.owner == authentication.name")
public void deleteBook(Book book);

還有一種 #argument123 的寫法, 即使用 Spring Security @P註解來為方法參數起別名, 然後在 @PreAuthorize 等註解表達式中使用該別名. 不推薦這種寫法, 代碼可讀性較差.

@PreAuthorize("#c.name == authentication.name")
public void doSomething(@P("c") Contact contact);
  1. 內置表達式有:
表達式 備註
hasRole([role]) 如果有當前角色, 則返回 true(會自動加上 ROLE_ 首碼)
hasAnyRole([role1, role2]) 如果有任一角色即可通過校驗, 返回true,(會自動加上 ROLE_ 首碼)
hasAuthority([authority]) 如果有指定許可權, 則返回 true
hasAnyAuthority([authority1, authority2]) 如果有任一指定許可權, 則返回true
principal 獲取當前用戶的 principal 主體對象
authentication 獲取當前用戶的 authentication 對象,
permitAll 總是返回 true, 表示全部允許
denyAll 總是返回 false, 代表全部拒絕
isAnonymous() 如果是匿名訪問, 返回true
isRememberMe() 如果是remember-me 自動認證, 則返回 true
isAuthenticated() 如果不是匿名訪問, 則返回true
isFullAuthenticated() 如果不是匿名訪問或remember-me認證登陸, 則返回true
hasPermission(Object target, Object permission)
hasPermission(Object target, String targetType, Object permission)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 土壤濕度感測器和dh11會獲取數據,然後樹莓派會處理這些數據,讀出土壤溫濕度和空氣溫濕度,並將這些數據上傳到雲伺服器, 雲伺服器會將這些數據顯示在網頁上,同時樹莓派會根據這些數據來決定是否控制繼電器進而控制水泵來澆水,當然,水泵是否澆水也可以通過事先做的網頁看到。 ...
  • https://www.datamentor.io/r-programming/data-frame/ Check if a variable is a data frame or not We can check if a variable is a data frame or not using ...
  • 通過實現 Aware 介面,可以在 Spring 啟動時,調用介面定義的方法,將 Spring 底層的一些組件註入到自定義的 Bean 中。 下麵列出了幾個 Spring 在 Aware 介面基礎上,進行擴展的介面,分別會在創建 Bean 時直接執行,或者通過 BeanPostProcessor 間 ...
  • 上一篇博客的最後簡單提了下CommitLog的刷盤 【RocketMQ中Broker的消息存儲源碼分析】 (這篇博客和上一篇有很大的聯繫) Broker的CommitLog刷盤會啟動一個線程,不停地將緩衝區的內容寫入磁碟(CommitLog文件)中,主要分為非同步刷盤和同步刷盤 非同步刷盤又可以分為兩種 ...
  • 一、Format類 1.直接實例化 2.可以繼承Format添加特殊字元 3.三個參數 (1)fmt:指定消息格式化字元串,如果不指定該參數則預設使用message的原始值 (2)datemt:指定日期格式字元串,如果不指定該參數,則預設使用“%Y-%m-%d %H:%M:%S" (3)style: ...
  • 項目進行微信開發, 認證了一個微信服務號專門用於內部測試,但是內部可能存在多套不同環境(開發dev、測試sit、預發佈uat)等,由於微信限制一個服務號只能配置一個網頁授權功能變數名稱, 又不可能給每個環境單獨配一個服務號,這樣不僅需要成本而且很浪費資源, 所以重點需要解決下麵這個問題: 1、可以自動區分環 ...
  • 函數概念: 函數是用來完成某種特定任務的可重用代碼塊; 函數可以使程式更具模塊化,擁有良好的結構; 函數定義後在程式中可以重覆調用; 函數分為內置函數和自定義函數 考點: 變數的作用域和靜態變數 延伸1,函數的參數及參數的引用傳遞。 延伸2,函數的返回值及引用返回。 延伸3,外部文件的導入。 延伸4 ...
  • [TOC] 原文鏈接: "Qt實現表格樹控制項 自繪樹節點虛線" 一、開心一刻 一程式員第一次上女朋友家她媽板著臉問 :你想娶我女兒,有多少存款? 程式員低了下頭:五百! 她媽更鄙視了:才五百塊,買個廁所都不夠! 程式員忙說:不是人民幣! 她媽:就算是美元,還是不夠買廁所! 程式員:其實是比特幣! 她 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...