做者:Eugen Paraschivspring
轉載自公衆號:stackgcexpress
本文將介紹如何使用 Maven 配置 Spring Security 和介紹使用 Spring Security 依賴的具體用例。最新的 Spring Security 版本能夠在 Maven Central 上獲取。安全
Spring Security 核心支持(spring-security-core)包含身份驗證和訪問控制功能,並支持獨立(非 Web)應用、方法級安全策略和 JDBC 整合:maven
<properties>
<org.springframework.security.version>3.2.3.RELEASE</org.springframework.security.version>
<org.springframework.version>4.0.4.RELEASE</org.springframework.version>
</properties>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>
複製代碼
請注意,咱們使用了 Spring Security 的 3.2.x.RELEASE 版本 —— Spring 和 Spring Security 的發行時間不一樣,所以他們的版本號不存在對應關係。spa
若是你使用的是舊版本的 Spring,那麼很是重要的一點就是:Spring Security 3.1.x 不依賴於 Spring 3.1.x 發行版!這是由於 Spring Security 3.1.x 早於 Spring 3.1 發佈。將來這些依賴的版本號將逐漸靠攏 —— 有關更多詳細信息,請參閱此 JIRA — 但在目前看來,這仍是有實際意義的,咱們將在下面討論。code
要爲 Spring Security 添加 Web 支持,須要添加 spring-security-web 依賴:orm
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${org.springframework.security.version}</version>
</dependency>
複製代碼
以上包含了過濾器和相關的 Web 安全基礎設施,可在 Servlet 環境中啓用 URL 訪問控制。xml
這個新依賴跟 Maven 依賴圖存在一個問題 —— 如上所述,Spring Security jar 不依賴於最新的 Spring core jar(但以前的版本不是這樣)。這可能會致使較舊的依賴被使用,而不是較新的 4.x Spring 工件(artifact)。作用域
爲了瞭解爲何會發生這種狀況,咱們須要看看 Maven 是如何解決衝突的 —— 在版本衝突狀況下,Maven 會選擇最靠近樹根節點的 jar。在咱們的例子中,spring-core 由 spring-orm(4.x.RELEASE 版本)定義,也由 spring-security-core(舊的 3.2.8.RELEASE 版本)定義 —— 因此在這兩種狀況下,spring-jdbc 在咱們項目的根 pom 定義的深度爲 1 。所以,在咱們本身的 pom 中定義的 spring-orm 和 spring-security-core 是怎樣使用順序呢 —— 優先考慮第一個,所以咱們可能會在 classpath 中使用任一版本。
爲了解決這個問題,咱們在 pom 中必須明肯定義一些 Spring 依賴,而不是依賴於隱式的 Maven 依賴解析機制 —— 這樣作會使咱們 pom 中的特定依賴深度爲 0 (由於它自己定義在 pom 中),所以它會優先被考慮。如下全部都屬於同一類別,都須要明肯定義,對於多模塊項目,須要在父級的 dependencyManagement 元素中定義:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
複製代碼
要想使用 Spring Security XML 命名空間,須要添加 spring-security-config 依賴:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${org.springframework.security.version}</version>
<scope>runtime</scope>
</dependency>
複製代碼
沒有應用代碼須要用到該依賴進行編譯,所以它應該設置爲 runtime 做用域。
LDAP、ACL、CAS 和 OpenID 也有 Spring Security 的相關依賴:spring-security-ldap、spring-security-acl、spring-security-cas 和 spring-security-openid。
Spring 在自定義 Maven 倉庫中提供了 Spring Security milestones(里程碑版本) 和 snapshots(快照版本),有關配置的更多詳細信息,請參閱如何使用 milestones 和 snapshots。
本文討論了使用 Spring Security 與 Maven 的相關細節。這裏提到的 Maven 依賴只是一些重要的經常使用依賴。但這也爲你在 Maven 項目中使用 Spring 提供了很好的參考點。