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,如需转载请自行联系原作者
目录
相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2665 5
|
12月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1912 5
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
602 2
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
812 70
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1529 0
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
845 0
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
750 7
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
425 0

热门文章

最新文章