1. 安全數據庫架構
框架使用了各類數據庫模式,本附錄爲它們提供了一個參考點。 您只須要提供所需功能區域的表格。html
給出了HSQLDB數據庫的DDL語句。 您可使用這些做爲定義正在使用的數據庫的架構的指導。mysql
1.1。 用戶架構
UserDetailsService(JdbcDaoImpl)的標準JDBC實現要求表加載密碼,賬戶狀態(啓用或禁用)以及用戶權限列表(角色)。 您將須要調整此模式以匹配您正在使用的數據庫方言。web
create table users( username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(50) not null, enabled boolean not null ); create table authorities ( username varchar_ignorecase(50) not null, authority varchar_ignorecase(50) not null, constraint fk_authorities_users foreign key(username) references users(username) ); create unique index ix_auth_username on authorities (username,authority);
1.1.1。 集團主管部門
Spring Security 2.0引入了對JdbcDaoImpl中的組管理員的支持。 若是組啓用,表結構以下。 您將須要調整此模式以匹配您正在使用的數據庫方言。正則表達式
create table groups ( id bigint generated by default as identity(start with 0) primary key, group_name varchar_ignorecase(50) not null ); create table group_authorities ( group_id bigint not null, authority varchar(50) not null, constraint fk_group_authorities_group foreign key(group_id) references groups(id) ); create table group_members ( id bigint generated by default as identity(start with 0) primary key, username varchar(50) not null, group_id bigint not null, constraint fk_group_members_group foreign key(group_id) references groups(id) );
請記住,只有在使用提供的JDBC UserDetailsService實現時,才須要這些表。 若是您本身編寫或選擇在沒有UserDetailsService的狀況下實施AuthenticationProvider,則只要符合接口合同,就能夠徹底自由地存儲數據。spring
1.2。 持久登陸(記住我)模式
此表用於存儲由更安全的持久令牌remember-me實現使用的數據。 若是您直接或經過命名空間使用JdbcTokenRepositoryImpl,那麼您將須要此表。 請記住調整此模式以匹配您正在使用的數據庫方言。sql
create table persistent_logins ( username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null );
1.3。 ACL模式
Spring Security ACL使用了四個表。數據庫
- acl_sid 存儲ACL系統識別的安全身份。這些能夠是可能適用於多個校長的獨特校長或權限。
- acl_class 定義適用ACL的域對象類型。類列存儲對象的Java類名稱。
- acl_object_identity 存儲特定domai對象的對象標識定義。
- acl_entry 存儲適用於特定對象身份和安全身份的ACL權限。
假設數據庫將自動生成每一個身份的主鍵。當它在acl_sid或acl_class表中建立一個新行時,JdbcMutableAclService必須可以檢索這些。它有兩個屬性定義了檢索這些值classIdentityQuery和sidIdentityQuery所需的SQL。這兩個默認調用identity()express
ACL工件JAR包含用於在HyperSQL(HSQLDB),PostgreSQL,MySQL / MariaDB,Microsoft SQL Server和Oracle數據庫中建立ACL模式的文件。這些模式也在如下部分中演示。api
mysql瀏覽器
CREATE TABLE acl_sid ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, principal BOOLEAN NOT NULL, sid VARCHAR(100) NOT NULL, UNIQUE KEY unique_acl_sid (sid, principal) ) ENGINE=InnoDB; CREATE TABLE acl_class ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, class VARCHAR(100) NOT NULL, UNIQUE KEY uk_acl_class (class) ) ENGINE=InnoDB; CREATE TABLE acl_object_identity ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, object_id_class BIGINT UNSIGNED NOT NULL, object_id_identity BIGINT NOT NULL, parent_object BIGINT UNSIGNED, owner_sid BIGINT UNSIGNED, entries_inheriting BOOLEAN NOT NULL, UNIQUE KEY uk_acl_object_identity (object_id_class, object_id_identity), CONSTRAINT fk_acl_object_identity_parent FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id), CONSTRAINT fk_acl_object_identity_class FOREIGN KEY (object_id_class) REFERENCES acl_class (id), CONSTRAINT fk_acl_object_identity_owner FOREIGN KEY (owner_sid) REFERENCES acl_sid (id) ) ENGINE=InnoDB; CREATE TABLE acl_entry ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, acl_object_identity BIGINT UNSIGNED NOT NULL, ace_order INTEGER NOT NULL, sid BIGINT UNSIGNED NOT NULL, mask INTEGER UNSIGNED NOT NULL, granting BOOLEAN NOT NULL, audit_success BOOLEAN NOT NULL, audit_failure BOOLEAN NOT NULL, UNIQUE KEY unique_acl_entry (acl_object_identity, ace_order), CONSTRAINT fk_acl_entry_object FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity (id), CONSTRAINT fk_acl_entry_acl FOREIGN KEY (sid) REFERENCES acl_sid (id) ) ENGINE=InnoDB;
oracle
CREATE TABLE acl_sid ( id NUMBER(38) NOT NULL PRIMARY KEY, principal NUMBER(1) NOT NULL CHECK (principal in (0, 1)), sid NVARCHAR2(100) NOT NULL, CONSTRAINT unique_acl_sid UNIQUE (sid, principal) ); CREATE SEQUENCE acl_sid_sequence START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE OR REPLACE TRIGGER acl_sid_id_trigger BEFORE INSERT ON acl_sid FOR EACH ROW BEGIN SELECT acl_sid_sequence.nextval INTO :new.id FROM dual; END; CREATE TABLE acl_class ( id NUMBER(38) NOT NULL PRIMARY KEY, class NVARCHAR2(100) NOT NULL, CONSTRAINT uk_acl_class UNIQUE (class) ); CREATE SEQUENCE acl_class_sequence START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE OR REPLACE TRIGGER acl_class_id_trigger BEFORE INSERT ON acl_class FOR EACH ROW BEGIN SELECT acl_class_sequence.nextval INTO :new.id FROM dual; END; CREATE TABLE acl_object_identity ( id NUMBER(38) NOT NULL PRIMARY KEY, object_id_class NUMBER(38) NOT NULL, object_id_identity NUMBER(38) NOT NULL, parent_object NUMBER(38), owner_sid NUMBER(38), entries_inheriting NUMBER(1) NOT NULL CHECK (entries_inheriting in (0, 1)), CONSTRAINT uk_acl_object_identity UNIQUE (object_id_class, object_id_identity), CONSTRAINT fk_acl_object_identity_parent FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id), CONSTRAINT fk_acl_object_identity_class FOREIGN KEY (object_id_class) REFERENCES acl_class (id), CONSTRAINT fk_acl_object_identity_owner FOREIGN KEY (owner_sid) REFERENCES acl_sid (id) ); CREATE SEQUENCE acl_object_identity_sequence START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE OR REPLACE TRIGGER acl_object_identity_id_trigger BEFORE INSERT ON acl_object_identity FOR EACH ROW BEGIN SELECT acl_object_identity_sequence.nextval INTO :new.id FROM dual; END; CREATE TABLE acl_entry ( id NUMBER(38) NOT NULL PRIMARY KEY, acl_object_identity NUMBER(38) NOT NULL, ace_order INTEGER NOT NULL, sid NUMBER(38) NOT NULL, mask INTEGER NOT NULL, granting NUMBER(1) NOT NULL CHECK (granting in (0, 1)), audit_success NUMBER(1) NOT NULL CHECK (audit_success in (0, 1)), audit_failure NUMBER(1) NOT NULL CHECK (audit_failure in (0, 1)), CONSTRAINT unique_acl_entry UNIQUE (acl_object_identity, ace_order), CONSTRAINT fk_acl_entry_object FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity (id), CONSTRAINT fk_acl_entry_acl FOREIGN KEY (sid) REFERENCES acl_sid (id) ); CREATE SEQUENCE acl_entry_sequence START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE OR REPLACE TRIGGER acl_entry_id_trigger BEFORE INSERT ON acl_entry FOR EACH ROW BEGIN SELECT acl_entry_sequence.nextval INTO :new.id FROM dual; END;
2.安全名稱空間
本附錄提供了對安全命名空間中可用的元素的引用以及它們建立的基礎bean的信息(假設各個類的知識以及它們如何協同工做) - 您能夠在本文檔中的Javadoc和其餘地方找到更多信息)。若是之前沒有使用命名空間,請閱讀命名空間配置的入門章節,由於這是爲了補充信息。建議在編輯基於模式的配置時使用高質量的XML編輯器,由於這將提供有關哪些元素和屬性可用的上下文信息以及解釋其目的的註釋。命名空間以RELAX NG Compact格式編寫,後來轉換爲XSD模式。若是您熟悉此格式,則可能但願直接檢查模式文件。
2.1。 Web應用程序安全
2.1.1。 <debug>
啓用Spring Security調試基礎架構。這將提供可讀(多行)調試信息來監視進入安全過濾器的請求。這可能包括敏感信息,例如請求參數或標頭,而且只能在開發環境中使用。
2.1.2。 <HTTP>
若是在應用程序中使用<http>元素,則會建立一個名爲「springSecurityFilterChain」的FilterChainProxy bean,並使用該元素內的配置在FilterChainProxy中構建一個過濾器鏈。從Spring Security 3.1開始,可使用其餘http元素來添加額外的過濾器鏈[24]。一些核心過濾器老是在過濾器鏈中建立,其餘核心過濾器將根據存在的屬性和子元素添加到堆棧中。標準過濾器的位置是固定的(請參閱命名空間介紹中的過濾器順序表),當用戶必須在FilterChainProxy bean中顯式配置過濾器鏈時,刪除與之前版本的框架的常見錯誤源。固然,若是您須要徹底控制配置,您能夠繼續執行此操做。
須要引用AuthenticationManager的全部過濾器將自動注入由命名空間配置建立的內部實例(有關AuthenticationManager的更多信息,請參閱介紹章節)。
每一個<http>命名空間塊老是建立一個SecurityContextPersistenceFilter,一個ExceptionTranslationFilter和一個FilterSecurityInterceptor。這些是固定的,不能替代替代品。
<http>屬性
<http>元素上的屬性控制核心篩選器上的某些屬性。
- access-decision-manager-ref 可選屬性,指定應用於受權HTTP請求的AccessDecisionManager實現的ID。默認狀況下,使用基於AffirmativeBased的實現與RoleVoter和AuthenticatedVoter。
- access-denied-page 不同意訪問被拒絕處理程序的子元素。
- authentication-manager-ref 對由此http元素建立的FilterChain使用的AuthenticationManager的引用。
- auto-config 自動註冊登陸表單,BASIC身份驗證,註銷服務。若是設置爲「true」,則添加全部這些功能(儘管您仍然能夠經過提供相應的元素來自定義每一個功能的配置)。若是未指定,則默認爲「false」。不建議使用此屬性。改用明確的配置元素來避免混淆。
- create-session 控制Spring Security類建立HTTP會話的渴望。選項包括:
- always- 若是不存在,Spring Security將主動建立一個會話。
- ifRequired - Spring Security只會在須要的時候建立一個會話(默認值)。
- never - Spring Security將永遠不會建立一個會話,但若是該應用程序會使用該會話,則會使用該會話。
- stateless - Spring Security不會建立一個會話,忽略會話以獲取Spring身份驗證。
- disable-url-rewriting 防止將會話ID附加到應用程序中的URL。若是此屬性設置爲true,客戶端必須使用cookie。默認值爲false。
- entry-point-ref 一般使用的AuthenticationEntryPoint將根據已配置的身份驗證機制進行設置。此屬性容許經過定義將啓動身份驗證過程的自定義AuthenticationEntryPoint bean來覆蓋此行爲。
- jaas-api-provision 若是可用,做爲從JaasAuthenticationToken獲取的Subject執行請求,該對象經過將JaasApiIntegrationFilter bean添加到堆棧來實現。默認爲false。
- name 一個bean標識符,用於引用上下文中其餘位置的bean。
- once-per-request 對應於FilterSecurityInterceptor的observeOncePerRequest屬性。默認爲true。
- path-type 不推薦使用請求匹配器。
- pattern 定義http元素的模式控制將經過其定義的過濾器列表過濾的請求。解釋取決於配置的請求匹配器。若是沒有定義模式,全部請求將被匹配,因此最具體的模式應首先聲明。
- realm 設置用於基自己份驗證的領域名稱(若是已啓用)。對應於BasicAuthenticationEntryPoint上的realmName屬性。
- request-matcher 定義FilterChainProxy中使用的RequestMatcher策略以及由intercept-url建立的Bean以匹配傳入的請求。對於ant,正則表達式和不區分大小寫的正則表達式,選項目前是ant,regex和ciRegex。使用其模式和方法屬性爲eachintercept-url元素建立單獨的實例。使用AntPathRequestMatcher匹配Ant路徑,並使用RegexRequestMatcher匹配正則表達式。有關這些類的Javadoc詳細瞭解匹配是如何執行的。 Ant路徑是默認策略。
- request-matcher-ref 對實現RequestMatcher的bean的一個引用,該Bean將肯定是否應該使用此FilterChain。這是模式更強大的替代方案。
- security 經過將此屬性設置爲none,能夠將請求模式映射到空的過濾器鏈。沒有安全性將被應用,而且沒有Spring Security的功能將可用。
- security-context-repository-ref 容許將自定義SecurityContextRepository注入到SecurityContextPersistenceFilter中。
- servlet-api-provision 提供HttpServletRequest安全方法的版本,例如isUserInRole()和getPrincipal(),它們經過將SecurityContextHolderAwareRequestFilter bean添加到堆棧來實現。默認爲true。
- use-expressions 在訪問屬性中啓用EL表達式,如基於表達式的訪問控制一章中所述。
Child Elements of <http>
- x509
2.1.3。 <access-denied-handler>
此元素容許您爲ExceptionTranslationFilter使用的默認AccessDeniedHandler設置errorPage屬性,使用error-page屬性,或使用theref屬性提供本身的實現。這在ExceptionTranslationFilter的一節中有更詳細的討論。
<access-denied-handler>的父元素
<access-denied-handler>屬性
- 錯誤頁面若是請求沒有權限訪問的頁面,那麼被認證的用戶將被重定向到的訪問被拒絕的頁面。
- ref定義對「AccessDeniedHandler」類型的Spring bean的引用。
2.1.4。 <headers>
此元素容許配置要與響應一塊兒發送的附加(安全)標頭。它能夠輕鬆配置幾個標題,並容許經過標題元素設置自定義標頭。附加信息能夠在參考的安全性頭部分找到。
- Cache-Control,Pragma和Expires - 可使用cache-control元素設置。這樣能夠確保瀏覽器不會緩存您的安全頁面。
- Strict-Transport-Security - 可使用hsts元素進行設置。這樣能夠確保瀏覽器自動向將來的請求請求HTTPS。
- X-Frame-Options - 可使用frame-options元素設置。 X-Frame-Options頭可用於防止劫持攻擊。
- X-XSS-Protection - 可使用xss保護元件進行設置。瀏覽器可使用X-XSS-Protection標頭進行基本控制。
- X-Content-Type-Options - 可使用content-type-options元素進行設置。 X-Content-Type-Options標頭可防止Internet Explorer從聲明的內容類型中嗅探響應。下載擴展程序時也適用於Google Chrome。
<header>的父元素
<headers>的子元素
2.1.5。<cache-control>
添加Cache-Control,Pragma和Expires標頭,以確保瀏覽器不緩存您的安全頁面。
<cache-control>的父元素
2.1.6。<HSTS>
啓用時,將Strict-Transport-Security標頭添加到任何安全請求的響應。 這容許服務器指示瀏覽器自動使用HTTPS以備未來的請求。
<hsts>屬性
- include-sub-domains 指定是否應包括子域。 默認值爲true。
- max-age-seconds 指定主機應被視爲已知HSTS主機的最大時間長度。 默認一年
- request-matcher-ref 要用於肯定是否應該設置頭的RequestMatcher實例。 默認是若是HttpServletRequest.isSecure()爲true。
<hsts>的父元素
頭
2.1.7。<幀選項>
啓用時,將X-Frame-Options頭添加到響應中,這樣可讓較新的瀏覽器進行一些安全檢查並防止劫持攻擊。
<frame-options>屬性
...