Spring Security进阶身份认证之使用数据库中的用户进行身份认证(附源码)

简介:

    在上一篇HelloSpringSecurity一文中,我们使用了静态账号和密码的方式完成了身份认证。本文在上一篇博文的基础上,将使用数据库中的用户进行身份认证。从本文中你将会看到Spring Security使用数据库中的用户进行身份认证依然是非常简单的事情。


    1. 在pom.xml中添加mysql数据库驱动与c3p0数据源的相关的依赖。


1
2
3
4
5
6
7
8
9
10
  < 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 >


    2. 准备MySQL数据库及相关数据。


    本例子使用到user(用户表)、role(角色表)和user_role(用户角色表)三个表,表之间的关系如下:


wKioL1TBtlex1oMgAACUVwD_IMc921.jpg


    为了方便大家进行测试,建表的语句如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
Navicat MySQL Data Transfer
 
Source Server         : 10.0.0.12
Source Server Version : 50619
Source Host           : 10.0.0.12:3305
Source  Database        : favsecurity
 
Target Server Type    : MYSQL
Target Server Version : 50619
File Encoding         : 65001
 
Date : 2015-01-23 10:28:39
*/
 
SET  FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP  TABLE  IF EXISTS `role`;
CREATE  TABLE  `role` (
   `id`  int (11)  NOT  NULL  DEFAULT  '0'  COMMENT  'id' ,
   ` name `  varchar (50)  DEFAULT  NULL  COMMENT  'name' ,
   `descn`  varchar (50)  DEFAULT  NULL  COMMENT  'descn' ,
   PRIMARY  KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8 COMMENT= '角色表' ;
 
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT  INTO  `role`  VALUES  ( '1' ,  'ROLE_ADMIN' ,  '管理员角色' );
INSERT  INTO  `role`  VALUES  ( '2' ,  'ROLE_USER' ,  '用户角色' );
 
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP  TABLE  IF EXISTS ` user `;
CREATE  TABLE  ` user ` (
   `id`  int (11)  NOT  NULL  DEFAULT  '0'  COMMENT  'id' ,
   `username`  varchar (50)  DEFAULT  NULL  COMMENT  'username' ,
   ` password `  varchar (50)  DEFAULT  NULL  COMMENT  'password' ,
   `status`  varchar (1024)  DEFAULT  NULL  COMMENT  'status' ,
   `descn`  varchar (1024)  DEFAULT  NULL  COMMENT  'descd' ,
   PRIMARY  KEY  (`id`),
   KEY  `AK_Key_1` (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8 COMMENT= '用户表' ;
 
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT  INTO  ` user `  VALUES  ( '1' ,  'admin' ,  'admin' ,  '1' ,  '管理\r\n员' );
INSERT  INTO  ` user `  VALUES  ( '2' ,  'user' ,  'user' ,  '1' ,  '用户\r\n' );
INSERT  INTO  ` user `  VALUES  ( '3' ,  'favccxx' ,  'favboy' ,  '1' ,  '帅锅' );
 
-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP  TABLE  IF EXISTS `user_role`;
CREATE  TABLE  `user_role` (
   `user_id`  int (11)  DEFAULT  NULL  COMMENT  '用户表_id' ,
   `role_id`  int (11)  DEFAULT  NULL  COMMENT  '角色表_id' ,
   KEY  `FK_FK_USER_ROLE_ROLE` (`role_id`),
   KEY  `FK_FK_USER_ROLE_USER` (`user_id`),
   CONSTRAINT  `FK_FK_USER_ROLE_USER`  FOREIGN  KEY  (`user_id`)  REFERENCES  ` user ` (`id`),
   CONSTRAINT  `FK_FK_USER_ROLE_ROLE`  FOREIGN  KEY  (`role_id`)  REFERENCES  `role` (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8 COMMENT= '用户角色表' ;
 
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT  INTO  `user_role`  VALUES  ( '1' ,  '1' );
INSERT  INTO  `user_role`  VALUES  ( '1' ,  '2' );
INSERT  INTO  `user_role`  VALUES  ( '2' ,  '2' );
INSERT  INTO  `user_role`  VALUES  ( '3' ,  '1' );
INSERT  INTO  `user_role`  VALUES  ( '3' ,  '2' );

        
    3. 修改springSecurity.xml,更改security:authentication-provider提供的用户访问机制。


<security:authentication-manager>

  <security:authentication-provider>

   <security:user-service>

    <security:user name="favccxx" password="favccxx" authorities="ROLE_USER,ROLE_ADMIN"/>

    <security:user name="super" password="super" authorities="ROLE_SUPERADMIN"/>

   </security:user-service>

  </security:authentication-provider>

 </security:authentication-manager>


     将上面的灰色划掉的部分更改为下面绿色的部分。


<security:authentication-manager>

  <security:authentication-provider>

       <security:jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password,1 as enabled from user WHERE username=?"

        authorities-by-username-query="select u.username, r.name as role from user u,user_role ur, role r where u.id=ur.user_Id and r.id = ur.role_Id and u.username=?"/>

      </security:authentication-provider>

 </security:authentication-manager>


    备注:dataSource在springdb.xml中定义,在springSecurity.xml中引用springdb.xml即可。springdb.xml相关的文件如下:


    springdb.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< beans  xmlns = "http://www.springframework.org/schema/beans"
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context = "http://www.springframework.org/schema/context"
      xmlns:tx = "http://www.springframework.org/schema/tx"
      xmlns:aop = "http://www.springframework.org/schema/aop"
     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.0.xsd
           http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     ">
     
     < context:property-placeholder  location = "classpath:database.properties" />
     
     < bean  id = "dataSource"  class = "com.mchange.v2.c3p0.ComboPooledDataSource"  destroy-method = "close" >
         < property  name = "driverClass" >
             < value >${dataSource.driverClassName}</ value >
         </ property >
         < property  name = "jdbcUrl" >
             < value >${dataSource.url}</ value >
         </ property >
         < property  name = "user" >
             < value >${dataSource.username}</ value >
         </ property >
         < property  name = "password" >
             < value >${dataSource.password}</ value >
         </ property >
 
         <!-- 最大连接数 -->
         < property  name = "maxPoolSize" >
             < value >${dataSource.c3p0.max_size}</ value >
         </ property >
 
         <!-- 最小连接数 -->
         < property  name = "minPoolSize" >
             < value >${dataSource.c3p0.min_size}</ value >
         </ property >
 
         <!-- 最大空闲时间,超时未被使用则连接被抛弃,单位毫秒 -->
         < property  name = "maxIdleTime" >
             < value >${dataSource.c3p0.max_idle_time}</ value >
         </ property >
 
         <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
         <!-- 
         <property name="checkoutTimeout">
             <value>${dataSource.c3p0.checkout_timeout}</value>
         </property>
        -->
 
         <!-- 最大的PreparedStatement的数量 -->
         < property  name = "maxStatements" >
             < value >${dataSource.c3p0.max_statements}</ value >
         </ property >
 
         <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒 -->
         < property  name = "idleConnectionTestPeriod" >
             < value >${dataSource.c3p0.idle_test_period}</ value >
         </ property >
 
         <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
         < property  name = "acquireIncrement" >
             < value >${dataSource.c3p0.acquire_increment}</ value >
         </ property >
     </ bean >
     
</ beans >


    database.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<![CDATA[
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.username=favccxx
dataSource.password=favboy
dataSource.url=jdbc:mysql://10.0.0.12:3305/favsecurity?useUnicode=true&characterEncoding=utf-8
 
 
# For c3p0 connect pool
dataSource.c3p0.max_size=200
dataSource.c3p0.min_size=10
dataSource.c3p0.max_idle_time=300
#dataSource.c3p0.checkout_timeout=30000
dataSource.c3p0.max_statements=0
dataSource.c3p0.idle_test_period=120
dataSource.c3p0.acquire_increment=5
 
]]>


    4. 工程运行效果如下

wKioL1TBuF2icSKJAAEI0IdviBU699.jpg

wKiom1TBt4bRzodmAAGcgxLBT3Q508.jpg


    5. 点这里看看源代码。





本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1607284,如需转载请自行联系原作者
目录
相关文章
|
前端开发 数据库
会议室管理系统源码(含数据库脚本)
会议室管理系统源码(含数据库脚本)
365 0
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
2040 5
|
JavaScript API PHP
WordPress/Laravel企业官网源码-自适应多端SEO-前后端分离源码含数据库与部署文档​
本文详解如何结合WordPress与Laravel构建现代化企业官网,涵盖响应式设计、SEO优化、前后端分离、数据库安全及自动化部署。通过实战案例展示性能提升成果,并展望AI、云原生与区块链的未来融合方向,助力企业实现数字化增长。
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
前端开发 Java 关系型数据库
基于ssm的考研图书电子商务平台,附源码+数据库+论文
考研图书电子商务平台是一个基于Java的B/S架构系统,适用于Windows环境。该平台设有管理员和用户权限,管理员可管理商品、用户、留言板及订单,用户可管理收货地址、订单、收藏及购买商品。技术框架包括前端Vue+HTML+JavaScript+CSS+LayUI,后端SSM,数据库为MySQL。项目包含17个数据库表,支持Maven构建。提供演示视频和详细文档,支持免费远程调试安装,确保顺利运行。
325 13
基于ssm的考研图书电子商务平台,附源码+数据库+论文
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
881 0
|
Java 关系型数据库 MySQL
Java汽车租赁系统源码(含数据库脚本)
Java汽车租赁系统源码(含数据库脚本)
811 4
|
前端开发 Java 关系型数据库
基于ssm的社区物业管理系统,附源码+数据库+论文+任务书
社区物业管理系统采用B/S架构,基于Java语言开发,使用MySQL数据库。系统涵盖个人中心、用户管理、楼盘管理、收费管理、停车登记、报修与投诉管理等功能模块,方便管理员及用户操作。前端采用Vue、HTML、JavaScript等技术,后端使用SSM框架。系统支持远程安装调试,确保顺利运行。提供演示视频和详细文档截图,帮助用户快速上手。
699 17
|
前端开发 Java 关系型数据库
基于ssm的培训学校教学管理平台,附源码+数据库+论文
金旗帜文化培训学校网站项目包含管理员、教师和用户三种角色,各角色功能通过用例图展示。技术框架采用Java语言,B/S架构,前端为Vue+HTML+CSS+LayUI,后端为SSM,数据库为MySQL,运行环境为JDK8+Tomcat8.5。项目含12张数据库表,非前后端分离,支持演示视频与截图查看。购买后提供免费安装调试服务,确保顺利运行。
312 14
|
前端开发 Java 关系型数据库
基于ssm的网络直播带货管理系统,附源码+数据库+论文
该项目为网络直播带货网站,包含管理员和用户两个角色。管理员可进行主页、个人中心、用户管理、商品分类与信息管理、系统及订单管理;用户可浏览主页、管理个人中心、收藏和订单。系统基于Java开发,采用B/S架构,前端使用Vue、JSP等技术,后端为SSM框架,数据库为MySQL。项目运行环境为Windows,支持JDK8、Tomcat8.5。提供演示视频和详细文档截图。
491 10

热门文章

最新文章