【Spring Security】二、数据库管理用户权限

匿名 (未验证) 提交于 2019-12-03 00:39:02

一 引入相关的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,然后输入用户名与密码进行验证,与上一章节一样。

 

原文:https://www.cnblogs.com/sunny3096/p/9255183.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!