




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、序言為啥選擇 Spring Security歡迎閱讀咱們寫的Spring Security,咱們既不想寫一個簡單的入門,也不想翻譯已有的國外。咱們這個就是建立在咱們做的 OA 的基礎上,一點一滴總結出來的經(jīng)驗和教訓。首先必須一提的是,Spring Security 出身名門,它是 Spring 的一個子項目。它之前有個很響亮的名字 Acegi。這個原本坐落在 上的項目,后來終于因為跟 spring 的緊密連接,在2.0 時成為了 Spring 的一個子項目。即使是在開源泛濫的 Java 領域,統(tǒng)一權限管理框架依然是稀缺的,這也是為什么 SpringSecurity(Acegi)一出現(xiàn)就受到熱捧
2、的jsecurity 在做同樣的事情。(據(jù),據(jù)俺們所知,直到現(xiàn)在也只看到 apache 社區(qū)的,jsecurity 還很稚嫩。)Spring Security(Acegi)支持一大堆的權限功能,然后它又和 Spring 這個超流行的框架整合的很緊密,所以我們選擇它。實際上自從 Acegi它就很有名了。部分 I. 基礎篇在一開始,我們主要談談怎么配置 Spring Security,怎么使用 Spring Security。為了避免在每個例子中重復包含所有的第們使用了 Maven2 管理項目。如果你的的 Maven2依賴,要知道 Spring.jar 就有 2M 多,所以我上還沒安裝 Maven
3、2,那么可以參考我們。提供我們用使用的第依賴庫關系如下所示:INFO dependency:treeINFO com.family168.springsecuritybook:ch001:war:0.1 INFO -org.springframework.security:spring-security-taglibs:jar:2.0.5.RELEASE:compile INFO+-org.springframework.security:spring-security-core:jar:2.0.5.RELEASE:compile INFO| +- org.springframework:sp
4、ring-core:jar:2.0.8:compileINFO| +- org.springframework:spring-context:jar:2.0.8:compile INFO| | - aopalliance:aopalliance:jar:1.0:compileINFO| +- org.springframework:spring-aop:jar:2.0.8:compile INFO| +- org.springframework:spring-support:jar:2.0.8:runtime INFO| +- commons-logging:commons-logging:j
5、ar:1.1.1:compile INFO| +- commons-codec:commons-codec:jar:1.3:compile第 1 章 一個簡單的 HelloWorldINFO| - commons-collections:commons-collections:jar:3.2:compile INFO+-org.springframework.security:spring-security-acl:jar:2.0.5.RELEASE:compile INFO| - org.springframework:spring-jdbc:jar:2.0.8:compileINFO|-
6、org.springframework:spring-dao:jar:2.0.8:compile INFO- org.springframework:spring-web:jar:2.0.8:compile INFO- org.springframework:spring-beans:jar:2.0.8:compileSpring Security 中可以使用 Acegi-1.x的普通配置方式,也可以使用從 2.0才出現(xiàn)名空間配置方式,實際上這兩者實現(xiàn)的功能是完全一致的,只是新名空間配置方式可以把原來需要幾百行的配置壓縮成短短的幾十行。我們的式進行配置,凡事務求最簡。中都會使用命名空間的方1.
7、1. 配置過濾器為了在項目中使用Spring Security權限,首先要在 web.xml 中配置過濾器,這樣我們就可以對這個項目的每個請求了。所有的用戶在項目之前,都要先通過 Spring Security 的檢測,這從第一時間把沒有授權的請求排除在系統(tǒng)之外,保證系統(tǒng)的安全。關于過濾器配置的講解可以參考。1.2. 使用命名空間在 applicationContext.xml 中使用 Spring Security 提供名空間進行配置。<?xml version="1.0" encoding="UTF-8"?><beans:beans
8、 xmlns=""xmlns:beans=""xmlns:xsi=""xsi:schemaLocation=""><http auto-config='true'><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /><intercept-url pattern="/*" access="ROLE_USER" />&l
9、t;/http><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-clas s></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern&
10、gt;/*</url-pattern></filter-mapping>在 xml 中使用 Spring Security 提供名空間。http 部分配置如何用戶請求。auto-config='true'將自動配置幾種常用的權限控制機制,包括 form, anonymous, rememberMe。我們利用 intercept-url 來用戶需要具有何種權限才能對應的 url,可以。在 pattern 中指定一個特定的 url,也可以使用通配符指定一組類似的 url例子中定義的兩個 intercepter-url,第一個用來對/admin.jsp 的,第
11、二個使用了通配符/*,說明它將對系統(tǒng)中所有 url的。在實際使用中,Spring Security 采用的是一種就近原則,就是說當用戶的 url 資源滿足多個 intercepter-url 時,系統(tǒng)將使用第一個符合條件的 intercept-url 進行權限。在我們這個例子中就是,當用戶/admin.jsp 時,雖然兩個 intercept-url都滿足要求,但因為第一個 intercept-url 排在上面,所以 Spring Security 會使用第一個 intercept-url 中的配置處理對/admin.jsp 的請求,也就是說,只有那些擁有了ROLE_ADMIN 權限的用戶才能
12、/admin.jsp。access 指定的權限部分比較有趣,大家可以注意到這些權限標示的,實際上這與 Spring Security 中的 Voter 機制有著千絲萬縷的是以 ROLE_開頭,只有包含了特定前綴的字符串被 Spring Security 處理。目前來說我們只需要記住這一點就可以了,在以后的部分中我們會詳細講解 Voter 的內(nèi)容。user-service 中定義了兩個用戶,admin 和 user。為了簡便起見,我們使用明文定義了兩個用戶對應的,這只是為了當前演示的方便,之后的例子中我們會使用 SpringSecurity 提供的加密方式,避免用戶被他人竊取。最最重要的部分是
13、authorities,這里定義了這個用戶登陸之后將會擁有的權限,它與上面 intercept-url 中定義的權限對應。每個用戶可以同時擁有多個權限,例子中的 admin 用戶就擁有 ROLE_ADMIN 和 ROLE_USER 兩種權限,這使得admin 用戶在登陸之后可以ROLE_ADMIN 和 ROLE_USER的所有。與之對應的是,user 用戶就只擁有ROLE_USER 權限,所以他只能ROLE_USER的,而不能ROLE_ADMIN的。1.3. 完善整個項目<authentication-provider><user-service><user na
14、me="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /><user name="user" password="user" authorities="ROLE_USER" /></user-service></authentication-provider></beans:beans>因為 Spring Security 是建立在 Spring 的
15、基礎之上的,所以 web.xml 中除了需要配置我們剛剛提到的過濾器,還要加上加載 Spring 的相關配置。最終得到的 web.xml 看起來像是這樣:演示不同權限的用戶登陸之后可以不同的,我們?yōu)轫椖刻砑恿藘蓚€ jsp 文件,admin.jsp 和 index.jsp。其中 admin.jsp 只有那些擁有 ROLE_ADMIN 權限的用戶才能,而 index.jsp 只那些擁有 ROLE_USER 權限的用戶才能。最終我們的整個項目會變成下面這樣:+ ch001/+ src/<?xml version="1.0" encoding="UTF-8"
16、;?><web-app version="2.4"xmlns=""xmlns:xsi=""xsi:schemaLocation=""><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value></context-param><filter&
17、gt;<filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-clas s></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern&
18、gt;</filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>1.4. 運行示例首先確保安裝了 Maven2。如果之前沒用過 Maven2,可以參考我們的 Maven2。安裝好 Maven2 之后,進入 ch001 目錄,然后執(zhí)行 mvn。等到項目啟動完成后。打開瀏覽器面。就可以看到登陸頁圖 1.1. 用戶登陸信息
19、: Root WebApplicationContext: initialization completed in 1578 ms2009-05-28 11:37:50.171:INFO: Started SelectChannelConnector:8080 INFO Started Jetty ServerINFO Starting scanner at interval of 10 seconds.+ main/+ resources/* applicationContext.xml+ webapp/+ WEB-INF/* web.xml* admin.jsp* index
20、.jsp+ test/+ resources/* pom.xml這個簡陋的頁面是Spring Security 自動生成的,一來為了演示的方便,二來避免用戶編寫登陸頁面時犯錯,Spring Security 為了避免可能出現(xiàn)的風險,連測試用的登錄頁面都自動生成出來了。在這里我們就省去編寫登陸頁面的步驟,直接使用默認生成的登錄頁面進行演示吧。首先讓我們輸入一個錯誤用的用戶名或,這里我們使用 test/test,當然這個用戶是不存在的,點擊提交之后我們會得到這樣一個登陸錯誤提示頁面。圖 1.2. 登陸失敗如果輸入的是正確的用戶名和index.jsp。,比如 user/user,系統(tǒng)在登陸后會默認跳
21、轉到圖 1.3. 登陸這時我們可以點擊admin.jspadmin.jsp,也可以點擊 logout 進行注銷。如果點擊了 logout,系統(tǒng)會注銷當前登陸的用戶,然后跳轉至登陸頁面。如果點擊了admin.jsp就會顯示如下頁面。圖 1.4. 拒絕很遺憾,user 用戶是無法/admin.jsp 這個 url的,這在上面的配置文件中已經(jīng)有過深入的討論。我們在這里再簡要重復一遍:user 用戶擁有 ROLE_USER 權限,但是/admin.jsp需要用戶擁有ROLE_ADMIN 權限才能,所以當 user 用戶視圖被保護的頁面。/admin.jsp 時,Spring Security 會在中途
22、這一請求,返回拒絕為了正常登admin.jsp,我們需要先點擊 logout 注銷當前用戶,然后使用 admin/admin,然后再次點擊 admin.jsp就會顯示出 admin.jsp 中的內(nèi)容。圖 1.5. 顯示 admin.jsp根據(jù)我們之前的配置,admin 用戶擁有 ROLE_ADMIN 和 ROLE_USER 兩個權限,因為他擁有ROLE_USER 權限,所以可以問/admin.jsp。/index.jsp,因為他擁有 ROLE_ADMIN 權限,所以他可以訪至此,我們很高興的宣布,咱們已經(jīng)正式完成,并運行演示了一個最簡單的由 SpringSecurity 保護的 web 系統(tǒng),
23、護功能,多姿多彩的特性。我們會深入討論 Spring Security 為我們提供的其他保第 2 章 使用數(shù)據(jù)庫管理用戶權限上一章節(jié)中,我們把用戶信息和權限信息放到了 xml 文件中,這是為了演示如何使用最小的配置就可以使用 Spring Security,而實際開發(fā)中,用戶信息和權限信息通常是被保存在數(shù)據(jù)庫中的,為此 Spring Security 提供了通過數(shù)據(jù)庫獲得用戶權限信息的方式。2.1. 修改配置文件為了從數(shù)據(jù)庫中獲取用戶權限信息,我們所需要的僅僅是修改配置文件中的authentication-provider 部分。將上一章配置文件中的 user-service 替換為 jdbc
24、-user-service,替換內(nèi)容如下所示:將上述紅色部分替換為下面黃色部分?,F(xiàn)在只要再為jdbc-user-service 提供一個 dataSource 就可以讓 Spring Security 使用數(shù)據(jù)庫中的權限信息了。在此我們使用 spring 創(chuàng)建一個演示用的 dataSource 實現(xiàn),這個dataSource 會連接到 hsqldb 數(shù)據(jù)庫,從中獲取用戶權限信息。1最終的配置文件如下所示:<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverM
25、anagerDataSource"><beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/><beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/><beans:property name="username" value="sa"/><beans:propert
26、y name="password" value=""/></beans:bean><authentication-provider><jdbc-user-service data-source-ref="dataSource"/></authentication-provider><authentication-provider><user-service><user name="admin" password="admi
27、n" authorities="ROLE_USER, ROLE_ADMIN"/><user name="user" password="user" authorities="ROLE_USER" /></user-service></authentication-provider>2.2. 數(shù)據(jù)庫表結構Spring Security 默認情況下需要兩張表,用戶表和權限表。以下是 hsqldb 中的建表語句:create table users(username v
28、archar_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
29、);<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns=""xmlns:beans=""xmlns:xsi=""xsi:schemaLocation=""><http auto-config='true'><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /
30、><intercept-url pattern="/*" access="ROLE_USER" /></http><authentication-provider><jdbc-user-service data-source-ref="dataSource"/></authentication-provider><beans:bean id="dataSource" class="org.springframework.jdbc.da
31、tasource.DriverManagerDataSource"><beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/><beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/><beans:property name="username" value="sa"/>&
32、lt;beans:property name="password" value=""/></beans:bean></beans:beans>users:用戶表。包含 username 用戶登錄名,password 登陸禁用三個字段。,enabled 用戶是否被其中 username 用戶登錄名為主鍵。authorities:權限表。包含 username 用戶登錄名,authorities 對應權限兩個字段。其中 username 字段與 users 用戶表的主鍵使用外鍵關聯(lián)。對 authorities 權限表的 user
33、name 和 authority 創(chuàng)建唯一索引,提高效率。Spring Security 會在初始化時,從這兩張表中獲得用戶信息和對應權限,將這些信息保存到緩存中。其中 users 表中的登錄名和用來用戶的登錄,而權限表中的信息用來控制用戶登陸后是否限受保護的系統(tǒng)。我們在示例中預先初始化了一部分數(shù)據(jù):上述 sql 中,我們創(chuàng)建了兩個用戶 admin 和 user,其中 admin 擁有 ROLE_ADMIN 和 ROLE_USER權限,而 user 只擁有 ROLE_USER 權限。這和我們上一章中的配置相同,因此本章實例的效果也和上一章完全相同,這里就不再贅述了。實例見 ch002。1 ja
34、vax.sql.DataSource 是一個用來定義數(shù)據(jù)庫連接池的統(tǒng)一接口。當我們想調(diào)用任何實現(xiàn)了 javax.sql.DataSource 接口的連接池,只需要調(diào)用接口提供的 getConnection()就可以獲得連接池中的jdbc 連接。javax.sql.DataSource 可以連接池的不同實現(xiàn),我們使用的連接池即可能由第包單獨提供,也可能是由 j2ee 容器統(tǒng)一管理提供的。第 3 章 自定義數(shù)據(jù)庫表結構insert into users(username,password,enabled) values('admin','admin',true);
35、insert into users(username,password,enabled) values('user','user',true);insert into authorities(username,authority) values('admin','ROLE_ADMIN'); insert into authorities(username,authority) values('admin','ROLE_USER'); insert into authorities(username,
36、authority) values('user','ROLE_USER');create unique index ix_auth_username on authorities (username,authority);Spring Security 默認提供的表結構太過簡單了,其實就算默認提供的表結構很復雜,也無法滿足所有企業(yè)內(nèi)部對用戶信息和權限信息管理的要求。基本上每個企業(yè)內(nèi)部一套的用戶信息管理結構,同時也會有一套對應的權限信息體系,如何讓 Spring Security 在這些已有的數(shù)據(jù)結構之上運行呢?3.1. 自定義表結構假設我們實際使用的表結構如下所
37、示:-create table role( id bigint,name varchar(50), descn varchar(200);alter table role add constraint pk_role primary key(id);alter table role alter column id bigint generated by default as identity(start with 1);- 用戶create table user( id bigint,username varchar(50), password varchar(50), status inte
38、ger, descn varchar(200);alter table user add constraint pk_user primary key(id);alter table user alter column id bigint generated by default as identity(start with 1);- 用戶連接表 create table user_role(user_id bigint, role_id bigint);alter table user_role add constraint pk_user_role primary key(user_id,
39、 role_id); alter table user_role add constraint fk_user_role_user foreign key(user_id) references user(id);alter table user_role add constraint fk_user_role_role foreign key(role_id) references role(id);上述共有三張表,其中 user 用戶表,role表為保存用戶權限數(shù)據(jù)的主表,user_role為關聯(lián)表。user 用戶表,roleER 圖如下所示:表之間為多對多關系,就是說一個用戶可以有多個。
40、圖 3.1. 數(shù)據(jù)庫表關系3.2. 初始化數(shù)據(jù)創(chuàng)建兩個用戶,admin 和 user。admin 用戶擁有“管理員”色。,user 用戶擁有“用戶”角insert into user(id,username,password,status,descn) values(1,'admin','admin',1,' 管理員');insert into user(id,username,password,status,descn) values(2,'user','user',1,' 用戶');insert
41、 into role(id,name,descn) values(1,'ROLE_ADMIN','管理員'); insert into role(id,name,descn) values(2,'ROLE_USER','用戶');insert into user_role(user_id,role_id) values(1,1);3.3. 獲得自定義用戶權限信息現(xiàn)在我們要在這樣的數(shù)據(jù)結構基礎上使用 Spring Security,Spring Security 所需要的數(shù)據(jù)只是為了處理兩種情況,一是登錄用戶是否合法,二是登陸的用戶
42、是否限訪問受保護的系統(tǒng)。我們所要做的工作就是在現(xiàn)有數(shù)據(jù)結構的基礎上,為 Spring Security 提供這兩種數(shù)據(jù)。3.3.1. 處理用戶登陸當用戶登陸時,系統(tǒng)需要用戶登錄名是否存在,登陸是否正確,當前用戶是否被禁用。我們使用下列SQL 來提取這三個信息。3.3.2. 檢驗用戶權限用戶登陸之后,系統(tǒng)需要獲得該用戶的所限,根據(jù)用戶已被賦予的權限來哪些系統(tǒng)可以被用戶,哪些不用戶。以下 SQL 就可以獲得當前用戶所擁有的權限。將這兩條 SQL 語句配置到 xml 中,就可以讓 Spring Security 從我們自定義的表結構中提取數(shù)據(jù)了。最終配置文件如下所示:<authenticati
43、on-provider>select u.username, as authority from user ujoin user_role uron u.id=ur.user_id join role ron r.id=ur.role_id where u.username=?"/>select username,password,status as enabled from userwhere username=?insert into user_role(user_id,role_id) values(1,2); insert into user_role
44、(user_id,role_id) values(2,2);users-by-username-query 為根據(jù)用戶名查找用戶,系統(tǒng)通過傳入的用戶名當前用戶的登錄名,和是否被禁用這一狀態(tài)。authorities-by-username-query 為根據(jù)用戶名查找權限,系統(tǒng)通過傳入的用戶名當前用戶已被授予的所限。實例見 ch003。第 4 章 自定義登陸頁面<jdbc-user-service data-source-ref="dataSource"users-by-username-query="select username,password,stat
45、us asenabledfrom userwhere username=?"authorities-by-username-query="select u.username, asauthorityfrom user ujoin user_role ur on u.id=ur.user_idjoin role ron r.id=ur.role_id where u.username=?"/></authentication-provider>Spring Security 雖然默認提供了一個登陸頁面,但是這個頁面實在太簡陋了,只有在快
46、速演示時才有可能它做系統(tǒng)的登陸頁面,實際開發(fā)時無論是從美觀還是實用性角度考慮,我們都必須實現(xiàn)自定義的登錄頁面。4.1. 實現(xiàn)自定義登陸頁面實現(xiàn)一個login.jsp,放在 src/main/webapp/目錄下。4.2. 修改配置文件在 xml 中的 http中添加一個 form-login。讓沒登陸的用戶也可以login.jsp。2這是因為配置文件中的“/*”配置,要求用戶任意一個系統(tǒng)時,必須擁有ROLE_USER,/login.jsp 也不例外,如果我們不為/login.jsp 單獨配置權限,會造成用戶連登陸的權限都沒有,這是不正確的。<http auto-config='t
47、rue'><intercept-url pattern="/login.jsp" access="IS AUTHENTICATED ANONYMOUSLY"/><intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /><intercept-url pattern="/*" access="ROLE_USER" /><form-login login-page=&q
48、uot;/login.jsp"authentication-failure-url="/login.jsp?error=true" default-target-url="/" /></http>+ ch004/+ src/+ main/+ resources/* applicationContext.xml+ webapp/+ WEB-INF/* web.xml* admin.jsp* index.jsp* login.jsp+ test/+ resources/* pom.xmllogin-page 表示用戶登陸時顯示我們
49、自定義的 login.jsp。這時我們系統(tǒng)顯示的登陸頁面將是我們上面創(chuàng)建的 login.jsp。authentication-failure-url 表示用戶登陸失敗時,跳轉到哪個頁面。當用戶輸入的登錄名和不正確時,系統(tǒng)將再次跳轉到/login.jsp,并添加一個error=true 參數(shù)作為登陸失敗的標示。default-target-url 表示登陸時,跳轉到哪個頁面。34.3. 登陸頁面中的參數(shù)配置以下是我們創(chuàng)建的login.jsp 頁面的主要代碼。/j_spring_security_check,提交登陸信息的 URL 地址。自定義 form 時,要把 form 的 action 設置
50、為/j_spring_security_check。注意這里要使用絕對路徑,避免登陸頁面存放的頁面可能帶來的問題。4j_username,輸入登陸名的參數(shù)名稱。j_password,輸入的參數(shù)名稱_spring_security_remember_me,選擇是否自動登錄的參數(shù)名稱。可以直接把這個參數(shù)設置為一個 checkbox,無需設置 value,Spring Security 會自行<div class="error $param.error = true ? '' : 'hide'"> 登陸失敗<br>$sess
51、ionScope'SPRING_SECURITY_LAST_EXCEPTION'.message</div><form action="$pageContext.reqontextPath/j_spring_security_check " style="width:260px;text-align:center;"><fieldset><legend>登陸</legend>用戶: <input type="text" name="j_user
52、name " style="width:150px;" value="$sessionScope'SPRING_SECURITY_LAST_USERNAME'"/><br />: <input type="password" name="j_password " style="width:150px;" /><br/><input type="checkbox" name="_spring_s
53、ecurity_remember_me " />兩周之內(nèi)不必登陸<br /><input type="submit" value="登陸"/><input type="reset" value="重置"/></fieldset></form>它是否被選中。以上介紹了自定義頁面上 Spring Security 所需的基本元素,這些參數(shù)名稱都采用了 SpringSecurity 中默認的配置值,如果有特殊需要還可以通過配置文件進行修改。4.4
54、. 測試一下經(jīng)過以上配置,我們終于使用了一個創(chuàng)建的登陸頁面替換了原來 Spring Security 默認提供的登錄頁面了。我們不僅僅是做個樣子,而是實際配置了各個 Spring Security 所需的參數(shù),真正將自定義登陸頁面與 Spring Security 緊緊的整合在了一起。以下是使用自定義登陸頁面實際運行時的截圖。圖4.1.進入登錄頁面圖4.2.用戶登陸失敗實例見 ch004。2 有關用戶的知識,我們會在之后的章節(jié)中進行講解。3 登陸后跳轉策略的知識,我們會在之后的章節(jié)中進行講解。4 關于絕對路徑和相對路徑的詳細討論,請參考第 5 章 使用數(shù)據(jù)庫管理國內(nèi)對權限系統(tǒng)的基本要求是將用戶
55、權限和被保護都放在數(shù)據(jù)進行管理,在這點上Spring Security 并沒有給出的解決方案,為此我們需要對 Spring Security 進行擴展。5.1. 數(shù)據(jù)庫表結構這次我們使用五張表,user 用戶表,role間的連接表實現(xiàn)多對多關系。表,resc表相互,它們通過各自之-create table resc( id bigint,name varchar(50), res_type varchar(50), res_string varchar(200), priority integer,descn varchar(200);alter table resc add constrai
56、nt pk_resc primary key(id);alter table resc alter column id bigint generated by default as identity(start with 1);-create table role( id bigint,name varchar(50), descn varchar(200);alter table role add constraint pk_role primary key(id);alter table role alter column id bigint generated by default as
57、 identity(start with 1);- 用戶create table user( id bigint,username varchar(50), password varchar(50), status integer,descn varchar(200);alter table user add constraint pk_user primary key(id);alter table user alter column id bigint generated by default as identity(start with 1);- 連接表user 表中包含用戶登陸信息,r
58、ole。表中包含信息,resc表中包含需要保護的ER 圖如下所示:create table resc_role( resc_id bigint, role_id bigint);alter table resc_role add constraint pk_resc_role primary key(resc_id, role_id); alter table resc_role add constraint fk_resc_role_resc foreign key(resc_id) references resc(id);alter table resc_role add constrai
59、nt fk_resc_role_role foreign key(role_id) references role(id);- 用戶連接表 create table user_role(user_id bigint, role_id bigint);alter table user_role add constraint pk_user_role primary key(user_id, role_id); alter table user_role add constraint fk_user_role_user foreign key(user_id) references user(id
60、);alter table user_role add constraint fk_user_role_role foreign key(role_id) references role(id);圖 5.1. 數(shù)據(jù)庫表關系5.2. 初始化數(shù)據(jù)創(chuàng)建的兩個用戶分別對應“管理員”“/admin.jsp”和“/*”,“用戶”和“用戶”。而“管理員”可以只能“/*”。5.3. 實現(xiàn)從數(shù)據(jù)庫中信息Spring Security 沒有提供從數(shù)據(jù)庫獲得獲取信息的,實際上 Spring Security 甚至沒有為我們留一個半個的擴展接口,所以我們這次要費點兒腦筋了。首先,要搞清楚需要提供何種類型的數(shù)據(jù),然后,尋找可以讓我們編寫的代碼替換原有功能的切入點,實現(xiàn)了以上兩步之后,就可以宣布大功告成了。5.3.1. 需要何種數(shù)據(jù)格式從配置文件上可以看到,Spring Security 所需的數(shù)據(jù)應該是一系列 URL址所需的權限:和這些網(wǎng)<intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />insert into user(id,username,password,status,descn) values(1,'admin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025管理人員崗前安全培訓考試試題及答案考點提分
- 2025廠級安全培訓考試試題附參考答案(考試直接用)
- 2025年工廠安全培訓考試試題及答案高清版
- 2025年建筑工程勞務分包合同范本
- 2025終止租賃合同協(xié)議書范本
- 2025二手商業(yè)店鋪買賣合同范本
- 2025建筑工程混凝土購銷合同
- 2025租賃經(jīng)營合同(3)新版:全面優(yōu)化與合作方共贏策略
- 2025年鉆采裝備項目建議書
- 2025精英企業(yè)合同協(xié)議
- 連云港2025年連云港市贛榆區(qū)事業(yè)單位招聘31人筆試歷年參考題庫附帶答案詳解
- 8.1薪火相傳的傳統(tǒng)美德 課件-2024-2025學年統(tǒng)編版道德與法治七年級下冊
- 湖北省武漢市2025屆高中畢業(yè)生四月調(diào)研考試語文試卷及答案(武漢四調(diào))
- 食堂負面清單管理制度
- 2025年安徽省示范高中皖北協(xié)作區(qū)第27屆聯(lián)考 生物學(含解析)
- 2025年度專業(yè)技術人員繼續(xù)教育公需科目考試題(附答案)
- 2025年中考語文《教材字音、字形》梳理
- 2024年上半年教資科目一試題
- 施工員頂崗實習報告范文
- 毽球知到智慧樹章節(jié)測試課后答案2024年秋武漢職業(yè)技術學院
- 霧化吸入療法合理用藥專家共識(2024版)課件
評論
0/150
提交評論