javascript
具有Spring Security的Grails
1. Spring Security與Grails集成的概述
Spring Security吹捧了許多身份驗證,授權,基于實例的功能以及各種其他功能,這些特性使其對使用安全的應用程序具有極大的吸引力。
考慮到這一點,由于Grails使用了Spring的Inversion of Control Framework和MVC設置,因此開發人員試圖使用Spring Security來保護Grails。
這產生了兩個值得注意的插件: Spring Security Core插件和Spring Security ACL插件 。
我們將審查這些Spring Security插件的功能,并與將Spring Security用于普通的舊Spring應用程序進行比較。
2. Spring Security Core插件
該插件提供了實用的默認設置以及許多用于自定義的配置選項。
2.1域類
Spring Security Core插件使用默認的Grails域類。 為了對插件使用標準查找,我們至少需要一個Person and Authority域類。
如果要在數據庫中存儲URL <==>角色映射(這是定義映射的幾種方法之一),則需要一個Requestmap域類。 如果我們使用推薦的方法來映射Person和Authority之間的多對多關系,那么我們還需要一個域類來映射聯接表。
要使用用戶/組查找,我們還需要一個組域類。 如果我們使用推薦的方法來映射“ 個人”和“ 組”之間以及“ 組”和“ 授權”之間的多對多關系,則每個域都需要一個域類來映射聯接表。 我們仍然可以通過這種方法另外使用Requestmap 。
我們可以使用s2-quickstart生成域類。 語法非常簡單:
grails s2-quickstart DOMAIN_CLASS_PACKAGE USER_CLASS_NAME ROLE_CLASS_NAME [REQUESTMAP_CLASS_NAME] [--groupClassName=GROUP_CLASS_NAME]具有Person , Authority和Requestmap的示例 :
grails s2-quickstart com.ourapp Person Authority Requestmap2.2配置請求映射以保護URL
我們可以選擇以下方法來配置請求映射以保護URL:
- @Secured批注。 這被認為是默認方法。
- application.groovy中的Map。 這稱為靜態地圖
- 存儲在數據庫中的 Requestmap 域類實例
我們一次只能使用一種方法。
例如,這里使用@Secured批注和Spring Expression Language(SpEL):
class SecureController {@Secured("hasRole('ROLE_USER')")def someRandomAction() {...}2.3其他各種功能
Spring Security Core插件的一些各種功能包括:
- 用于處理較低級別的Spring Security的幫助程序類,例如SecurityTagLib ,它提供GSP標簽以支持基于用戶是否通過身份驗證和/或具有執行特定操作所需的角色的條件顯示。
- 事件–包括事件通知,事件偵聽器和回調關閉。
- 過濾器,包括定義將哪些過濾器應用于不同的URL模式的功能。
3. Spring Security ACL插件
Spring Security ACL插件向使用上述Spring Security Core插件的Grails應用程序添加了域對象安全支持。 因此,我們需要在build.gradle中已有其他插件。
添加域對象安全性支持是什么意思? Spring Security Core插件和其他擴展插件支持通過規則來限制對URL的訪問,這些規則包括檢查用戶的身份驗證狀態,角色等。ACL插件通過添加對限制訪問各個域類實例的支持來擴展此功能。
3.1方法安全性
Spring Security中通常提供的四個注釋可與Spring Expression Language(SpEL)表達式一起使用,以執行基于表達式的訪問控制 :
- @PreAuthorize
- @PreFilter
- @PostAuthorize
- @PostFilter
以上注釋全部記錄在Spring Security文檔的“ 方法安全性表達式”部分中。
使用方法安全性的能力是Spring Security ACL插件和Spring Security Core插件之間的非常重要的區別。 如果要實現細粒度的訪問控制,則出于這個原因,必須使用Spring Security ACL插件。
值得慶幸的是,除了Groovy和Java之間的語法差異之外,該代碼實際上看起來是相同的:
@PreAuthorize("hasRole('ROLE_USER')")@PostFilter("hasPermission(filterObject, read) or " +"hasPermission(filterObject, admin)")List getAllDocs(params = [:]) {Report.list(params)}3.2域類
像Spring Security Core插件一樣,Spring Security ACL插件使用域類進行適當的結構化。
在這種情況下,域類用于管理數據庫狀態。 為了與通常基于JDBC的Spring Security代碼兼容,將創建域類以生成表名和列名。
該插件中與持久性關聯的類使用這些類。 但是,可以通過運行s2-create-acl-domains腳本來覆蓋它們:
grails s2-create-acl-domains因此,該腳本將在應用程序的grails-app/domain文件夾中生成相同的域類,以進行一些自定義。
3.3各種其他功能
Spring Security ACL插件的一些各種功能包括:
- 身份驗證運行替換:這是一個臨時身份驗證開關,僅持續進行一次方法調用。
- 自定義權限: BasePermission類提供5種權限: READ , WRITE , CREATE , DELETE和ADMINISTRATION 。 您可以根據需要添加自己的權限。
- 標簽庫(taglib)用于允許和拒絕。
4。結論
Spring Security Core插件提供了許多非常有用的功能,用于通過Spring Security保護Grails,但是為了實現更復雜,更細粒度的授權,必須結合使用Spring Security ACL插件。
推薦讀物: 基于創建者的授權資源(Spring Security)以及我關于Spring框架的文章,以獲取有關Spring的一般知識。
翻譯自: https://www.javacodegeeks.com/2019/01/grails-spring-security.html
總結
以上是生活随笔為你收集整理的具有Spring Security的Grails的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins部署java_在Windo
- 下一篇: gradle idea java ssm