<authentication-provider> <user-service> <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="user" password="user" authorities="ROLE_USER" /> </user-service> </authentication-provider>
將上述配置代碼配置為
<authentication-provider> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider>
現在只要再為jdbc-user-service提供一個dataSource就可以讓Spring Security使用數據庫中的權限信息了。在此我們使用spring創建一個演示用的dataSource實現,這個dataSource會連接到hsqldb數據庫,從中獲取用戶權限信息。[1]
<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.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"/> <beans:property name="password" value=""/> </beans:bean>
最終的配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?> <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.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <http auto-config='true'> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider> </authentication-manager> //連接數據庫 <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.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"/> <beans:property name="password" value=""/> </beans:bean> </beans:beans>
數據庫表結構
Spring Security默認情況下需要兩張表,用戶表和權限表。以下是hsqldb中的建表語句:
create table users(1 username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(50) not null, enabled boolean not null ); create table authorities (2 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);3
1.users:用戶表。包含username用戶登錄名,password登陸密碼,enabled用戶是否被禁用三個字段。
其中username用戶登錄名為主鍵。
2.authorities:權限表。包含username用戶登錄名,authorities對應權限兩個字段。
其中username字段與users用戶表的主鍵使用外鍵關聯。
3.對authorities權限表的username和authority創建唯一索引,提高查詢效率
Spring Security會在初始化時,從這兩張表中獲得用戶信息和對應權限,將這些信息保存到緩存中。其中users表中的登錄名和密碼用來控制用戶的登錄,而權限表中的信息用來控制用戶登陸后是否有權限訪問受保護的系統資源。
我們在示例中預先初始化了一部分數據:
insert into users(username,password,enabled) values('admin','admin',true); 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,authority) values('user','ROLE_USER');
這個實現和之前將用戶和用戶權限寫在配置文件中明顯方便很多。尤其是用戶數量過多時。不過這種方法是保持最基本的表結構,也是默認的表結構。最好在理解原理基礎上自定義數據庫。(方法后續講到。)