CAS统一身份认证(四):集成MySQL用户验证

本文主要介绍CAS统一身份认证服务器JDBC密码管理,并以FreeBSD环境下的MySQL数据库为例实现CAS 6.6版的数据库用户验证。主要包括以下几个方面:

  1. JDBC密码管理
  2. MySQL数据库准备
  3. 用户验证属性配置文件
  4. 配置MySQL数据库支持
  5. 构建和测试CAS服务

本文使用的软件版本:

  1. FreeBSD 13.0
  2. OpenJDK 11.0.2
  3. gradle 7.3.3
  4. MySQL 8.0

1 JDBC密码管理

CAS统一认证的用户名密码可存储于的数据库中,通过JDBC访问数据库,获取用户名和密码。同时还可以设置或者自定义密码的加密方法,以满足多标准化的密码加密需求。

通过CAS Overlay模板增加数据库支持非常简单,只需要准备好数据库,然后能过配置gradle任务就可以生成新的支持数据库密码存储的cas.war。

CAS统一身份认证(二):Overlay配置管理中介绍了使用Overlay模板进行配置管理过程,并对配置文件的覆盖策略作了说明。由于集成数据库支持需求导入数据库的JDBC驱动等库文件及相关属性配置,使用外部独立配置文件时需要自己去下载一系列相关的jar包,且不能自动应对CAS服务版本的升级,所以选用Overlay模板方式来集成JDBC数据库,通过gradle任务自动完成最终Web应用包的构建。

当然,在cas.war包构建完成后,在生产环境中依然可以使用CAS统一身份认证(三):外部独立配置节中介绍了外部文件独立配置方法来对CAS生产系统进行配置。

2 MySQL数据库准备

在开始构建数据库支持的CAS认证服务之前,首先要准备好数据库。

(1)用户账号表

CAS会从数据库中查询用户名、密码、电子邮件、电话号码4个字段,可以使用以下SQL语句创建。

create table cas_user (
  id int  NOT NULL AUTO_INCREMENT,
  username varchar(255),
  password varchar(255),
  email varchar(255),
  phone varchar(255),
  PRIMARY KEY(id)
);

(2)安全问题表

当需要找回密码时,CAS会从数据库中查询用户名、密码问题和答案3个字段,可以使用以下SQL语句创建。

create table cas_password_question (
  id int NOT NULL AUTO_INCREMENT,
  userid varchar(255),
  question varchar(255),
  answer varchar(255),
  PRIMARY KEY (id)
);

如果使用项目自备的数据库的话,一定要包含这几个字段,否则就要使用上面的SQL语句创建对应的数据表以后才能使用。

最后别忘了在cas_user数据表添加至少一条用户记录,要不然登录时就没用户可用了。

 CAS统一身份认证(四):集成MySQL用户验证_第1张图片

3 集成数据库驱动

增加数据库支持功能需要使用Overlay模板方式重新构建cas.war。首先打开build.gradle文件,在dependencies段中添加JDBC和MySQL支持如下:

implementation "org.apereo.cas:cas-server-support-pm-jdbc:${project.'cas.version'}"
implementation "org.apereo.cas:cas-server-support-jdbc-drivers:${project.'cas.version'}"
implementation "mysql:mysql-connector-java:8.0.28"

添加依赖时可以同时指定了包的版本,当然也可以不用考虑依赖包的版本号,依赖管理插件会自动解决这些版本号。修改后的build.gradle文件片断如下,最后三行为增加的JDBC和MySQL依赖。

dependencies {
    /**
     * CAS dependencies and modules may be listed here.
     *
     * There is no need to specify the version number for each dependency
     * since versions are all resolved and controlled by the dependency management
     * plugin via the CAS bom.
     **/
    implementation "org.apereo.cas:cas-server-support-jdbc:${project.'cas.version'}"
    implementation "org.apereo.cas:cas-server-support-jdbc-drivers:${project.'cas.version'}"
    implementation "mysql:mysql-connector-java"
}

4 用户验证属性配置文件

进入overlay-template-master文件夹,在src/main/resources目录下创建application.properties文件,这个文件中的配置会覆盖预编译包中的application.properties文件中配置的属性。

这一步也可以先不着急配置,建议在cas.war包构建完成之后,使用CAS统一身份认证(三):外部独立配置节中介绍的外部文件独立配置方法,在生产环境的/etc/cas/config文件夹下创建一个application-standalone.properties文件,然后在这个文件中对CAS生产系统进行外部独立配置。这也是本文正在使用的外部文件独立配置方法。

5 去除静态用户验证验证

创建/etc/cas/config/application-standalone.properties文件,输入以下配置去除静态用户验证

##
# CAS Authentication Credentials
#
cas.authn.accept.enabled=false
#cas.authn.accept.users=casuser::cas2022
#cas.authn.accept.name=Static Credentials

6 配置MySQL数据库支持

在application-standalone.properties文件中继续输入以下配置,增加MySQL数据库支持。

cas.authn.jdbc.query[0].driver-class=com.mysql.cj.jdbc.Driver
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=123456
cas.authn.jdbc.query[0].sql=select * from cas.cas_user where username=?
cas.authn.jdbc.query[0].field-password=password

cas.authn.jdbc.query[0].password-encoder.encoding-algorithm=
cas.authn.jdbc.query[0].password-encoder.type=NONE

#cas.authn.jdbc.bind[0].principal-transformation.groovy.location=

 其中的数据库名称、数据库用户名、数据库用户密码、用户信息SQL查询语句、密码字段名称、是否使用口令加密算法等可以根据自己的实际情况和需求来选择。

7 重新构建CAS应用包

使用以下命令重新构建CAS应用包

rm src/main/resources/application.properties
./gradlew --info clean build

注意这里首先删除了编译目录中的application.properties配置文件,如果你更喜欢在构建时将配置文件包含进Web应用包的话,在这里就不用删除了。

使用gradlew脚本进行构建时,会自动下载缺失的依赖并导入到项目中,如下图所示就是对新添加的三个依赖进行自动下载和包含。

Cached resource https://oss.sonatype.org/content/repositories/snapshots/org/apereo/cas/cas-server-support-jdbc-drivers/6.6.0-SNAPSHOT/cas-server-support-jdbc-drivers-6.6.0-20220903.093135-114.jar is up-to-date (lastModified: Sat Sep 03 09:49:28 GMT 2022).
Cached resource https://oss.sonatype.org/content/repositories/snapshots/org/apereo/cas/cas-server-support-jdbc/6.6.0-SNAPSHOT/cas-server-support-jdbc-6.6.0-20220903.093135-114.jar is up-to-date (lastModified: Sat Sep 03 09:49:26 GMT 2022).
Downloading https://repo.maven.apache.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar to /root/.gradle/.tmp/gradle_download7591157756739201348bin

构建完成后,即可在build/libs目录下生成cas.jar应用包。

8. 测试CAS服务

执行java -jar build/libs/cas.jar,启动CAS服务,运行结果如下:

CAS统一身份认证(四):集成MySQL用户验证_第2张图片

 打开浏览器,在地址栏中输入以下地址即可打开CAS登录页面

https://localhost:8443/cas/login

在登录页面中输入原来的静态用户和密码casuser:Mellon发现已经不能登录了,会出现“认证信息无效”的错误提示。输入存储在数据库中的用户名casuser:123456可以登录成功。

CAS统一身份认证(四):集成MySQL用户验证_第3张图片

 至此,集成MySQL的统一身份认证过程就成功实现了,可以在此基础上继续进行密码加密、用户信息修改,以及用户的锁定、失效、禁止登录等功能。

最后,别忘了使用https://localhost:8443/cas/logout进行注销。

你可能感兴趣的:(Web信息系统,mysql,数据库,web安全,服务器,unix)