1. 程式人生 > >【Spring Security】二、數據庫管理用戶權限

【Spring Security】二、數據庫管理用戶權限

max xmlns art create http 文件 int nag del

一 引入相關的jar包

這個例子用的是mysql數據庫和c3p0開源的jdbc連接池,在項目的pom.xml中引入jar包

    <!-- Mysql -->
    <dependency>
            <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.21</version>
    </dependency>
    <
dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>

二 定義數據源

增加spring-dataSource.xml中定義c3p0的數據源,配置如下:

<?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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"
> <!-- 數據源 --> <beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 此為c3p0在spring中直接配置datasource c3p0是一個開源的JDBC連接池 --> <beans:property name="driverClass" value="com.mysql.jdbc.Driver" /> <beans:property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" /> <beans:property name="user" value="root" /> <beans:property name="password" value="" /> <beans:property name="maxPoolSize" value="50"></beans:property> <beans:property name="minPoolSize" value="10"></beans:property> <beans:property name="initialPoolSize" value="10"></beans:property> <beans:property name="maxIdleTime" value="25000"></beans:property> <beans:property name="acquireIncrement" value="1"></beans:property> <beans:property name="acquireRetryAttempts" value="30"></beans:property> <beans:property name="acquireRetryDelay" value="1000"></beans:property> <beans:property name="testConnectionOnCheckin" value="true"></beans:property> <beans:property name="idleConnectionTestPeriod" value="18000"></beans:property> <beans:property name="checkoutTimeout" value="5000"></beans:property> <beans:property name="automaticTestTable" value="t_c3p0"></beans:property> </beans:bean> </beans:beans>

因為本教程主要將spring security,數據源相關的配置就不在這裏贅述了,請自行搜索。

三 修改配置文件

為了從數據庫中獲取用戶權限信息,我們所需要的僅僅是修改spring-context.xml配置文件中的authentication-provider部分。修改後如下:
  <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource"/>
        </authentication-provider>
    </authentication-manager>

配置文件到這部就算修改完畢了,最終配置文件如下:

<?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-3.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security.xsd">
    <!-- 
    1.http部分配置如何攔截用戶請求。auto-config=‘true‘將自動配置幾種常用的權限控制機制,包括form, anonymous, rememberMe。
    2.利用intercept-url來判斷用戶需要具有何種權限才能訪問對應的url資源,可以在pattern中指定一個特定的url資源,也可以使用通配符指定一組
    類似的url資源。例子中定義的兩個intercepter-url,第一個用來控制對/admin.jsp的訪問,第二個使用了通配符/**,說明它將控制對系統中所有
    url資源的訪問。
    3.在實際使用中,Spring Security采用的是一種就近原則,就是說當用戶訪問的url資源滿足多個intercepter-url時,系統將使用第一個符合
    條件的intercept-url進行權限控制。在我們這個例子中就是,當用戶訪問/admin.jsp時,雖然兩個intercept-url都滿足要求,但因為第一個
    intercept-url排在上面,所以Spring Security會使用第一個intercept-url中的配置處理對/adminPage.jsp的請求,也就是說
    只有那些擁有了ROLE_ADMIN權限的用戶才能訪問/admin.jsp。
    4.access指定的權限都是以ROLE_開頭的,實際上這與Spring Security中的Voter機制有著千絲萬縷的聯系,只有包含了特定前綴的字符串才會
    被Spring Security處理。
     -->
    <http auto-config=‘true‘>
        <intercept-url pattern="/page/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:beans>

四 在mysql數據庫中新建表和插入數據

Spring Security默認情況下需要兩張表,用戶表和權限表。以下是mysql中的建表語句:

create table users(
    username varchar(50) not null primary key,
    password varchar(50) not null,
    enabled boolean not null
);

create table authorities (
    username varchar(50) not null,
    authority varchar(50) not null,
    constraint fk_authorities_users foreign key(username) references users(username)
);

create unique index ix_auth_username on authorities (username,authority);

插入數據語句:

insert into users(username,password,enabled) values(admin,123,true);
insert into users(username,password,enabled) values(user,123,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);

上述sql中,我們創建了兩個用戶admin和user,其中admin擁有ROLE_ADMIN和ROLE_USER權限,而user只擁有ROLE_USER權限。

在瀏覽器上輸入:http://localhost:8801/spring-security02,然後輸入用戶名與密碼進行驗證,與上一章節一樣。

【Spring Security】二、數據庫管理用戶權限