」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Spring 中使用 @Secured 註解的方法安全性

Spring 中使用 @Secured 註解的方法安全性

發佈於2024-07-31
瀏覽:767

Method security with @Secured Annotation in Spring

此註解提供了一種向業務方法添加安全配置的方法。

它將使用角色來檢查使用者是否有權呼叫此方法。註解是 Spring Security 的一部分。因此,要啟用它的使用,您需要 spring security 依賴項。

範例場景

您有一個包含產品 CRUD 的應用程式。在此 CRUD 中,您希望使用兩個特定角色來控制操作。

  • 使用者:可以建立產品並查看產品。但無法更新或刪除產品。
  • 管理員:可以進行所有使用者操作,也可以更新和刪除產品。

您可以使用@Secured 來管理這些角色對每個操作的存取權。

營運角色

我們可以在範例場景中定義以下角色。

  • ROLE_USER、ROLE_ADMIN

閱讀:

  • ROLE_USER、ROLE_ADMIN

更新:

  • ROLE_ADMIN

刪除:

  • ROLE_ADMIN

讓我們來看一個程式碼範例並觀察應用程式的行為。

新增 Spring Security 依賴

若要使用 @Secured 註釋,請新增 Spring Security 的 Maven 依賴項:


    org.springframework.boot
    spring-boot-starter-security

使用@Secured註解方法

我們使用 @Secured 註解方法,定義哪些角色可以存取方法行為。

public class Product {

    private Long id;
    private String name;
    private BigDecimal value;

    //getters and setters
}

@Service
public class ProductService {

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public Product createProduct(Product product) {
        // Logic for creating a product
        return product;
    }

    @Secured({"ROLE_USER", "ROLE_ADMIN"})
    public Product getProductById(Long id) {
        // Logic for fetching a product
        return null;
    }

    @Secured("ROLE_ADMIN")
    public Product updateProduct(Product product) {
        // Logic for updating a product
        return product;
    }

    @Secured("ROLE_ADMIN")
    public void deleteProduct(Long id) {
        // Logic for deleting a product
    }
}

應用程式配置

您需要新增@EnableGlobalMethodSecurity(securedEnabled = true)來設定您的Spring應用程式以使用@Secured啟用方法安全性。

@SpringBootApplication
@EnableTransactionManagement
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MasteryApplication {

    public static void main(String[] args) {
        SpringApplication.run(MasteryApplication.class, args);
    }

}

測試行為

在我們的範例中,我們將使用測試來測試行為,因此我們新增 spring boot 測試依賴項。


    org.springframework.security
    spring-security-test
    test


然後我們建立測試來驗證是否使用模擬使用者並為其分配特定角色,我們可以測試每個角色中的使用者以及我們的應用程式的行為。透過這樣做,我們可以確保只有正確的角色才能執行允許的操作。

@SpringBootTest
class ProductServiceTests {

    @Autowired
    private ProductService productService;

    @Test
    @WithMockUser(roles = "USER")
    void testCreateProductAsUser() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.createProduct(product));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testCreateProductAsAdmin() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.createProduct(product));
    }

    @Test
    @WithAnonymousUser
    void testCreateProductAsAnonymous() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.createProduct(product));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testGetProductByIdAsUser() {
        assertDoesNotThrow(() -> productService.getProductById(1L)); // Assuming product with ID 1 exists
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testGetProductByIdAsAdmin() {
        assertDoesNotThrow(() -> productService.getProductById(1L));
    }

    @Test
    @WithAnonymousUser
    void testGetProductByIdAsAnonymous() {
        assertThrows(AccessDeniedException.class, () -> productService.getProductById(1L));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testUpdateProductAsUser() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testUpdateProductAsAdmin() {
        Product product = new Product();
        assertDoesNotThrow(() -> productService.updateProduct(product));
    }

    @Test
    @WithAnonymousUser
    void testUpdateProductAsAnonymous() {
        Product product = new Product();
        assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product));
    }

    @Test
    @WithMockUser(roles = "USER")
    void testDeleteProductAsUser() {
        assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L));
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    void testDeleteProductAsAdmin() {
        assertDoesNotThrow(() -> productService.deleteProduct(1L));
    }

    @Test
    @WithAnonymousUser
    void testDeleteProductAsAnonymous() {
        assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L));
    }
}

就是這樣,現在您可以使用 @Secured 註解的角色來管理使用者對應用程式的存取。

如果你喜歡這個主題,記得關注我。在接下來的幾天裡,我將詳細解釋 Spring 註解!敬請關注!

跟我來!

版本聲明 本文轉載於:https://dev.to/tiuwill/method-security-with-secured-annotation-in-spring-1hgk?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用變數在 LESS 中動態建立屬性名稱?
    如何使用變數在 LESS 中動態建立屬性名稱?
    在LESS 中的屬性名稱中使用變數(動態屬性/屬性名稱插值)LESS 目前不支援動態插入屬性,儘管有關該主題的一些討論堆疊溢位。 解決方法#1:將動態產生的屬性注入到屬性值中This解決方法將動態建立的屬性注入到硬編碼的屬性值中: .vendors(@property, @value, @pre: ...
    程式設計 發佈於2024-12-21
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21
  • 如何理解和管理 Web 開發中的預設 CSS 樣式?
    如何理解和管理 Web 開發中的預設 CSS 樣式?
    HTML 元素的預設CSS 樣式:綜合指南HTML 元素的預設CSS 樣式:綜合指南瀏覽器經常將預設CSS 樣式應用於HTML 元素,導致元素外觀變更跨不同平台。了解這些預設樣式表對於一致且可預測的 Web 開發至關重要。 查找瀏覽器預設CSS每個瀏覽器都維護自己的預設CSS 樣式表:Firefox...
    程式設計 發佈於2024-12-21
  • LaravelWhereIn 與 GroupBy:如何解決 MySQL 的 1055 錯誤?
    LaravelWhereIn 與 GroupBy:如何解決 MySQL 的 1055 錯誤?
    Laravel:語法錯誤或存取衝突:使用WhereIn和GroupBy時出現1055錯誤對於特定行資料檢索,Laravel允許我們在同一查詢中同時使用WhereIn 和GroupBy。但是,這有時會導致「語法錯誤或存取衝突:1055 錯誤」。 錯誤原因此錯誤發生在以下情況:MySQL 設定中啟用了嚴...
    程式設計 發佈於2024-12-21
  • 如何取消註冊 net/http 套件中的處理程序?
    如何取消註冊 net/http 套件中的處理程序?
    在net/http中取消註冊處理程序在net/http中,處理程序可以使用http.Handle動態註冊到特定的URL模式功能。但是,預設的多工器不提供取消註冊處理程序的機制。 取消註冊處理程序的一種方法是建立一個擴充標準 http.ServeMux 類型的自訂多工器。此自訂多工器可以包含用於取消註...
    程式設計 發佈於2024-12-21
  • Go的別名型別轉換會建立副本嗎?
    Go的別名型別轉換會建立副本嗎?
    別名之間賦值會觸發Go中的複製嗎? Go允許使用別名定義自訂類型。人們擔心這些別名類型之間的轉換是否會導致副本或僅導致結構變更。 考慮以下範例:type MyString string var s = "very long string" var ms = MyString(s...
    程式設計 發佈於2024-12-21
  • 如何找到 C++ 向量中的最大值或最小值?
    如何找到 C++ 向量中的最大值或最小值?
    在C 語言中尋找向量中的最大值或最小值從C 語言中的向量取得最大值或最小值是一項常見的程式設計任務。讓我們探討如何實現此目的並解決與 max_element 函數相關的特定錯誤。 使用 max_element 庫中的 max_element 函數傳回一個指向的迭代器到給定範圍內的最大值。若要將其與向...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 巨集中實作可選參數以進行程式碼自訂?
    如何在 C++ 巨集中實作可選參數以進行程式碼自訂?
    使用 C 巨集自訂參數巨集是 C 程式設計的基本面,允許程式碼自訂和靈活性。一個常見的要求是能夠在巨集中定義可選參數。 可選參數考慮以下範例,其中我們有一個列印字串的巨集: #define PRINT_STRING(message) PrintString(message, 0, 0)此巨集接受一個...
    程式設計 發佈於2024-12-21
  • 如何創建 100% 高度並隱藏滾動條的全螢幕 Iframe?
    如何創建 100% 高度並隱藏滾動條的全螢幕 Iframe?
    全螢幕iframe高度為100%查詢:是否普遍支援iframe height=100%跨瀏覽器?當使用XHTML1作為doctype時,高度為100%的iframe是否會佔據頁面剩餘高度(不包括頂部的50px固定高度框架)?另外,如何在自動設定 iframe 高度的同時完全隱藏捲軸? 回應:雖然可以...
    程式設計 發佈於2024-12-21
  • 如何解決 VS2010 中混合 C 和 C++ 專案中的 LNK2001 連結器錯誤?
    如何解決 VS2010 中混合 C 和 C++ 專案中的 LNK2001 連結器錯誤?
    解決VS2010 中混合C 和C 專案中的連結器錯誤問題描述將C 程式碼整合到不同VS2010 專案中的C專案中導致從C 程式碼呼叫C 函數時出現連結錯誤。此錯誤標識為 LNK2001,與未解析的外部符號有關。 解決方案要修正此問題,請遵循特定準則來確保程式碼庫的正確組織: 模組化程式碼: 每個C模...
    程式設計 發佈於2024-12-21
  • 如何在.NET MySqlCommand中啟用MySQL使用者定義變數?
    如何在.NET MySqlCommand中啟用MySQL使用者定義變數?
    在.NET MySqlCommand中使用MySql使用者定義變數在.NET MySqlCommand中執行涉及使用者定義變數的MySQL語句時,您可能會遇到致命錯誤。要解決此問題,請按照下列步驟操作:在您的程式碼中,您有一條 MySQL 語句,用於設定使用者定義的變數“@a”,然後選擇其值。但是,...
    程式設計 發佈於2024-12-21
  • 如何在 Windows 版 XAMPP 升級 PHP:逐步指南
    如何在 Windows 版 XAMPP 升級 PHP:逐步指南
    在XAMPP for Windows 中升級PHP:綜合指南在XAMPP for Windows 中升級PHP 對於維護安全性、功能和效能至關重要您的網頁應用程式的相容性。本指南將提供成功升級 PHP 的逐步流程。 從 PHP 官方網站降級您可能嘗試過直接下載最新的 PHP來自 PHP 官方網站的版...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3