1. 概述
Spring Security 提供良好的支持,可以與 Spring Data 集成。前者負責我們應用程序的安全方面,而後者則提供方便的訪問應用程序的數據存儲庫的途徑。
在本文中,我們將討論如何 將 Spring Security 與 Spring Data 集成,以啓用更具用户特定性的查詢。
@EnableWebSecurity
public class WebSecurityConfig {
// Bean definitions
}
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
...
</beans:beans>
bean to the XML configuration file:
<bean class="org.springframework.security.data.repository
.query.SecurityEvaluationContextExtension"/>
makes all the common expressions in Spring Security available from within Spring Data queries.
etc.
3. 示例用法
讓我們考慮一下 Spring Data 和 Spring Security 的一些用例。
3.1. 限制 AppUser 字段更新
在此示例中,我們將研究限制 AppUser 的 lastLogin 字段更新僅限於當前已認證的用户。
這意味着每次觸發 updateLastLogin 方法時,它只會更新當前已認證用户的 lastLogin 字段。
要實現這一點,我們將以下查詢添加到我們的 UserRepository 接口中:
@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
+" u.username = ?#{ principal?.username }")
@Modifying
@Transactional
void updateLastLogin (@Param("lastLogin") Date lastLogin);
如果沒有 Spring Data 和 Spring Security 集成,我們通常需要將用户名作為參數傳遞到 updateLastLogin。
在提供錯誤的用户名憑據的情況下,登錄過程將失敗,我們無需擔心確保訪問權限驗證。
3.2. 使用分頁檢索特定 AppUser 內容
Spring Data 和 Spring Security 完美配合的另一個場景是在需要從數據庫中檢索當前已認證用户擁有的內容。
例如,如果有一個推特應用程序,我們可能希望在個性化信息流頁面上顯示當前用户創建或喜歡的內容。
當然,這可能涉及編寫查詢以與數據庫中的一個或多個表進行交互。藉助 Spring Data 和 Spring Security,這就像編寫:
public interface TweetRepository extends PagingAndSortingRepository<Tweet, Long>, CrudRepository<Tweet, Long> {
@Query("SELECT twt FROM Tweet twt JOIN twt.likes AS lk WHERE lk = ?#{ principal?.username }" +
" OR twt.owner = ?#{ principal?.username }")
Page<Tweet> getMyTweetsAndTheOnesILiked(Pageable pageable);
}
由於我們想要對結果進行分頁,我們的 TweetRepository 擴展了 PagingAndSortingRepository 接口。
從 Spring Data Commons 3.0 開始,對一些接口進行了重構,以減少耦合:CrudRepository、ListCrudRepository、PagingAndSortingRepository 和 ListPagingAndSortingRepository 具有中心接口 Repository。一個缺點是,如果需要 CRUD 操作,則必須擴展 CRUD 專用接口。
4. 結論
Spring Data 和 Spring Security 集成為管理 Spring 應用程序中的認證狀態帶來了很大的靈活性。
在本課程中,我們探討了如何將 Spring Security 添加到 Spring Data 中。有關 Spring Data 或 Spring Security 的其他強大功能,請參閲我們的 Spring Data 和 Spring Security 文章集合。
@EnableWebSecurity
public class WebSecurityConfig {
// Bean definitions
}
@Bean public SecurityEvaluationContextExtension securityEvaluationContextExtension() { return new SecurityEvaluationContextExtension(); }
bean to the XML configuration file: makes all the common expressions in Spring Security available from within Spring Data queries. etc. 讓我們考慮一下 Spring Data 和 Spring Security 的一些用例。 在此示例中,我們將研究限制 AppUser 的 lastLogin 字段更新僅限於當前已認證的用户。 這意味着每次觸發 updateLastLogin 方法時,它只會更新當前已認證用户的 lastLogin 字段。 要實現這一點,我們將以下查詢添加到我們的 UserRepository 接口中: 如果沒有 Spring Data 和 Spring Security 集成,我們通常需要將用户名作為參數傳遞到 updateLastLogin。 在提供錯誤的用户名憑據的情況下,登錄過程將失敗,我們無需擔心確保訪問權限驗證。 Spring Data 和 Spring Security 完美配合的另一個場景是在需要從數據庫中檢索當前已認證用户擁有的內容。 例如,如果有一個推特應用程序,我們可能希望在個性化信息流頁面上顯示當前用户創建或喜歡的內容。 當然,這可能涉及編寫查詢以與數據庫中的一個或多個表進行交互。藉助 Spring Data 和 Spring Security,這就像編寫: 由於我們想要對結果進行分頁,我們的 TweetRepository 擴展了 PagingAndSortingRepository 接口。 從 Spring Data Commons 3.0 開始,對一些接口進行了重構,以減少耦合:CrudRepository、ListCrudRepository、PagingAndSortingRepository 和 ListPagingAndSortingRepository 具有中心接口 Repository。一個缺點是,如果需要 CRUD 操作,則必須擴展 CRUD 專用接口。 Spring Data 和 Spring Security 集成為管理 Spring 應用程序中的認證狀態帶來了很大的靈活性。 在本課程中,我們探討了如何將 Spring Security 添加到 Spring Data 中。有關 Spring Data 或 Spring Security 的其他強大功能,請參閲我們的 Spring Data 和 Spring Security 文章集合。<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
...
</beans:beans><bean class="org.springframework.security.data.repository
.query.SecurityEvaluationContextExtension"/>3. 示例用法
3.1. 限制 AppUser 字段更新
@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
+" u.username = ?#{ principal?.username }")
@Modifying
@Transactional
void updateLastLogin (@Param("lastLogin") Date lastLogin);3.2. 使用分頁檢索特定 AppUser 內容
public interface TweetRepository extends PagingAndSortingRepository<Tweet, Long>, CrudRepository<Tweet, Long> {
@Query("SELECT twt FROM Tweet twt JOIN twt.likes AS lk WHERE lk = ?#{ principal?.username }" +
" OR twt.owner = ?#{ principal?.username }")
Page<Tweet> getMyTweetsAndTheOnesILiked(Pageable pageable);
}4. 結論