CAS 5.3.x 搭建和使用 – 使用 JDBC 单点登录

CAS 支持多种数据库身份验证,本文使用的是 MySql 进行的实践

一、创建数据库表

CREATE TABLE `acme_user` (
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户编号',
  `user_name` varchar(60) NOT NULL COMMENT '账户名称',
  `user_pass` varchar(255) NOT NULL COMMENT '账户密码',
  `user_email` varchar(100) NOT NULL DEFAULT '' COMMENT '账户邮箱',
  `expired` tinyint(1) DEFAULT '0' COMMENT '账户是否已过期',
  `disabled` tinyint(1) DEFAULT '0' COMMENT '账户是否被禁用',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

插入数据,密码采用 BCrypt 算法,明文为 123456

## 正常账户
insert into acme_user values ('1', 'acme', '$2a$08$jvlM7HkGKeec1lkS7JoQW.q8zfROC5DZtBk7ix/AZP687RTN5pGhO', 'acme-top@qq.com',  0, 0, 0);
## 过期账户
insert into acme_user values ('2', 'expired', '$2a$08$jvlM7HkGKeec1lkS7JoQW.q8zfROC5DZtBk7ix/AZP687RTN5pGhO', 'expired@qq.com',  1, 0, 0);
## 禁用账户
insert into acme_user values ('2', 'disabled', '$2a$08$jvlM7HkGKeec1lkS7JoQW.q8zfROC5DZtBk7ix/AZP687RTN5pGhO', 'disabled@qq.com', 0, 1, 0);

二、增加 JDBC 相关依赖

修改 /cas/build.gradle 文件,增加如下依赖

compile "org.apereo.cas:cas-server-support-jdbc:${project.'cas.version'}"
compile "org.apereo.cas:cas-server-support-jdbc-authentication:${project.'cas.version'}"
compile "org.apereo.cas:cas-server-support-jdbc-drivers:${project.'cas.version'}"
// 我的 mysql 版本是 5.7
compile "mysql:mysql-connector-java:5.1.47"

mysql 的 jdbc 驱动包需要选择和 mysql 版本想对应的版本,否则会报错,对应关系可以参考文章:https://blog.csdn.net/hchhan/article/details/81106992

三、修改 application.properties 配置

  1. 禁用默认的静态用户名密码
##
# CAS Authentication Credentials
#
# 当启用该配置时,为默认静态认证,登陆名为casuser密码为Mellon - 禁用此处配置
# cas.authn.accept.users=casuser::Mellon
  1. 增加 jdbc 的相关配置
cas.authn.jdbc.query[0].sql=SELECT * FROM acme_user WHERE user_name=?
cas.authn.jdbc.query[0].fieldPassword=user_pass
cas.authn.jdbc.query[0].fieldExpired=expired
cas.authn.jdbc.query[0].fieldDisabled=disabled
cas.authn.jdbc.query[0].principalAttributeList=sn,cn:commonName,givenName

cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/acme_account?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect

# 配置密码,此处配置的加密算法为 BCRYPT
# NONE|DEFAULT|STANDARD|BCRYPT|SCRYPT|PBKDF2
cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT
cas.authn.jdbc.query[0].passwordEncoder.strength=8

CAS 支持的密码类型

类型 描述
NONE 不进行密码编码(即纯文本)- 不推荐
DEFAULT 使用DefaultPasswordEncoderCAS。对于通过characterEncoding和的消息摘要算法encodingAlgorithm
BCRYPT 使用BCryptPasswordEncoder基于strength提供的和可选的secret
SCRYPT 使用SCryptPasswordEncoder
PBKDF2 使用Pbkdf2PasswordEncoder基于strength提供的和可选的secret
STANDARD 使用StandardPasswordEncoder基于secret提供的
org.example.MyEncoder 的实现PasswordEncoder你自己的选择

提示

  1. jdbc 的配置类是 org.apereo.cas.configuration.model.support.jdbc.JdbcAuthenticationProperties
  2. jdbc 数据查询验证的类是 org.apereo.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler
  3. 可以继承 org.springframework.security.crypto.password.PasswordEncoder 来实现自定义密码验证

参考文档

  1. jdbc 的配置可以参考官方文档 CAS 5.3 - Database Authentication
  2. 密码相关配置可参考官方文档 CAS 5.3 - Password Encoding

四、测试访问

  1. 正常账户 acme 登录,密码 123456,登录成功

登录成功

  1. expired 账户登录失败

账户已过期

  1. disabled 账户登录失败

账户已被禁用

发表评论