Spring Security教程(二)

上一篇博客中,Spring Security教程(一),我把用戶信息和權限信息放到了xml文件中,這是爲了演示如何使用最小的配置就能夠使用Spring Security,而實際開發中,用戶信息和權限信息一般是被保存在數據庫中的,爲此Spring Security也提供了經過數據庫得到用戶權限信息的方式。本教程將講解使用數據庫管理用戶權限。

html

一 引入相關的jar包

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

 

	<!-- 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>

  

二 定義數據源

 

在applicationContext.xml中定義c3p0的數據源,配置以下:mysql

<!-- 數據源 -->
	<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/springsecuritydemo?useUnicode=true&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>

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

 

三 修改配置文件

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

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

<?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">
	<http auto-config='true'>
		<intercept-url pattern="/adminPage.jsp" access="ROLE_ADMIN" />
		<intercept-url pattern="/**" access="ROLE_USER" />
	</http>
	<!-- 數據源 -->
	<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/springsecuritydemo?useUnicode=true&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>
	<!-- 默認數據庫對用戶進行存儲 -->
	<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','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');

  上述sql中,咱們建立了兩個用戶admin和user,其中admin擁有ROLE_ADMIN和ROLE_USER權限,而user只擁有ROLE_USER權限。這和咱們上一章中的配置相同,所以本章實例的效果也和上一節徹底相同,這裏就再也不贅述了。app

 

結果請參考教程一的結果jsp


---------------------
做者:AirMario
來源:CSDN
原文:https://blog.csdn.net/AirMario/article/details/53965765ide

相關文章
相關標籤/搜索