Easy几行代码搞定用户认证信息的My

前言

在上一个章节中,壹哥给大家讲解了如何基于内存模型来实现授权。在这种模型里,用户的信息是保存在内存中的。你知道,保存在内存中的信息,是无法持久化的。也就是说,程序一旦关闭,或者断电等情况发生时,内存中的信息就会丢失,所以这种方式并不适用于生产环境!

所以我们肯定要把用户的信息进行持久化,但持久化到哪里去呢?我们当然首选数据库!数据库是程序员必会必熟的知识点,尤其是后端开发人员。我们开发时常用的数据库有MySQL和Oracle,本案例中我们采用的是MySQL数据库。

一.JdbcUserDetailsManager类介绍

在进行编码之前,壹哥先和各位一起看看SpringSecurity给我们提供的持久化API都有哪些,以及这些API之间的结构关系。

1.UserDetailsService接口

SpringSecurity支持MySQL、Oracle等多种不同的数据源,这些不同的数据源最终都由UserDetailsService这个接口的子类来负责进行操作。我们来看看UserDetailsService接口都有哪些实现类:

2.JdbcUserDetailsManager实现类

在上一章节中,壹哥给大家介绍了如何在内存中创建并保存用户及角色信息,这种实现方式主要是利用InMemoryUserDetailsManager这个子类来实现的。如果我们想在数据库中创建并保存用户及角色信息,SpringSecurity也很贴心,它还给我们提供了另一个UserDetailsService的实现子类,也就是JdbcUserDetailsManager。其中JdbcUserDetailsManager类的关系结构如下图所示:

从上图中,我们可以看到JdbcUserDetailsManager的直接父类是JDBCDaoSuport,利用JdbcUserDetailsManager可以帮助我们以JDBC的方式对接数据库进行增删改查等操作。它内部设定了一个默认的数据库模型,只要遵从这个模型,我们就可以很方便地实现在数据库中创建用户名和密码、角色等信息,但是灵活性不足。

二.项目实现

了解完上面的相关API之后,咱们闲言少叙,直接动起手来撸码吧。

1.准备测试接口

接下来我们就在上一章节创建的项目基础之上,创建一个新的model,并对项目进行改造。我们还是跟之前一样,先创建3个测试接口,具体过程请参考之前的章节。

2.准备数据库

既然我们要操作数据库,那肯定得先建库建表啊,那么数据库和表结构是什么样的呢?我们怎么创建出来呢?其实JdbcUserDetailsManager本身就给我们提供了对应的数据库脚本模型,这个数据库脚本模型保存在如下位置:

org/springframework/security/co/userdetails/jdbc/users.ddl

所以我们直接去这个对应的位置下,找到这个数据库脚本文件打开即可。

3.users数据库脚本

当我们打开这个users.ddl文件,可以看到如下内容,会发现其中有2个建表语句,分别是创建了users表和authorities表,并且在authorities表中创建了唯一索引。

catetableusers(usernamevarchar_ignocase(50)notnullprimarykey,passwordvarchar_ignocase()notnull,enabledbooleannotnull);catetableauthorities(usernamevarchar_ignocase(50)notnull,authorityvarchar_ignocase(50)notnull,constraintfk_authorities_usersfoignkey(username)fencesusers(username));cateuniqueindexix_auth_usernameonauthorities(username,authority);

这时候我们只需要先自己创建一个数据库,编码格式就采用UTF-8,然后把上面的建表语句,复制粘贴并执行,创建出2个表即可。users表用来存放用户名、用户密码以及账户是否可用,authorities表用来存放用户名及其对应权限,authorities和users会通过username字段关联起来。

如下图所示:

注意:

上面的建表脚本中,有一种数据类型varchar_ignocase,这个是针对HSQLDB数据库创建的,但我们使用的MySQL数据库并不支持这种数据类型,所以这里需要我们手动将这个数据类型改为varchar。

4.添加数据库依赖

接下来我们在pom.xml文件中,除了已有的spring-web和spring-security的依赖之外,还要再新增关于数据库的依赖包。

dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion1.3.1/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build

5.添加数据库配置文件

添加完依赖包之后,我们在source目录下创建一个application.yml文件,并在其中添加关于数据库的配置信息。

spring:datasource:url:jdbc:mysql://localhost:/db-security02?useUnicode=truecharacterEncoding=utf-8useSSL=falseserverTimezone=GMTusername:rootpassword:syc

注意:

url中数据库的名字,需要改成自己的数据库名称,用户名和密码也要改成自己的mysql用户信息。

6.编写编码类

然后我们编写一个SecurityConfig类,在其中配置对资源的访问控制,创建一个UserDetailsService实例,并在其中配置,生成存储用户和角色信息。

EnableWebSecurity(debug=true)publicclassSecurityConfigextendsWebSecurityConfigurAdapter{

Overrideprotectedvoidconfigu(HttpSecurity


转载请注明:http://www.aierlanlan.com/cyrz/3962.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了