一、CAS 安装
参考:【CAS】CAS介绍与安装(一) - H__D - 博客园
二、CAS 数据库认证
本例使用的是mysql数据库
1. 新建表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(128) DEFAULT NULL,
`password` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `cas`.`user` (`id`, `username`, `password`) VALUES (1, 'test', '123456');
2. 项目引入依赖
在项目的pom.xml文件 有注释(Additional dependencies may be placed here),的位置处,新增JDBC 依赖
<!-- ...Additional dependencies may be placed here... --> <!-- JDBC --> <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${cas.version}</version> </dependency> <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-jdbc-drivers</artifactId> <version>${cas.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency>
3. 新增JDBC配置
在application.properties中 将cas默认用户注释掉,新增下面配置
## # CAS Authentication Credentials # #cas.authn.accept.users=casuser::Mellon # 使用数据库认证 # 查询用户信息的SQL,会把用户名作为参数传进来 cas.authn.jdbc.query[0].sql=select * from user where username=? # 指定密码字段 cas.authn.jdbc.query[0].fieldPassword=password # 指定过期字段,0未过期,1过期(需要修改密码) #cas.authn.jdbc.query[0].fieldExpired=expired_flag # 指定是否禁用字段,0未禁用,1禁用(账号不可用) #cas.authn.jdbc.query[0].fieldDisabled=disabled_flag cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/cas?characterEncoding=UTF-8&nullCatalogMeansCurrent=true&useSSL=false&rewriteBatchedStatements=true cas.authn.jdbc.query[0].user=root cas.authn.jdbc.query[0].password=123456
4. 重新打包发布,使用浏览器访问
访问:https://localhost:8443/cas/,使用用户:test/123456,可以登录成功
三、CAS 数据库密码加密校验
本例使用的是MD5加密,也可以使用其他加密方式
1. 数据库下生成MD5密文
SQL:SELECT MD5(123456) ===》e10adc3949ba59abbe56e057f20f883e
更新密码:
UPDATE `user` SET `password` = 'e10adc3949ba59abbe56e057f20f883e' WHERE `id` = 1;
2. 修改application.properties文件
在application.properties中,新增配置
# 默认加密策略,NONE 不加密 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
3. 重新打包发布,使用浏览器访问
访问:https://localhost:8443/cas/,使用用户:test/123456,可以登录成功
四、CAS 自定义密码认证
BCrypt算法示例
依赖
<!-- BCrypt算法 --> <dependency> <groupId>org.mindrot</groupId> <artifactId>jbcrypt</artifactId> <version>0.4</version> </dependency>
示例
package com.test.util; import org.mindrot.jbcrypt.BCrypt; public class BcryptExample { public static void main(String[] args) { String password = "123456"; System.out.println("BCrypt.gensalt() = " + BCrypt.gensalt()); System.out.println("BCrypt.gensalt() = " + BCrypt.gensalt()); // 生成哈希值,使用默认的工作因子(10) String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt()); System.out.println("Hashed Password: " + hashedPassword); String hashedPassword2 = BCrypt.hashpw(password, BCrypt.gensalt()); System.out.println("Hashed Password2: " + hashedPassword2); // 验证密码 boolean isPasswordCorrect = BCrypt.checkpw(password, hashedPassword); System.out.println("Password is correct: " + isPasswordCorrect); boolean isPasswordCorrect2 = BCrypt.checkpw(password, hashedPassword2); System.out.println("Password is correct: " + isPasswordCorrect2); } }
1. 引入算法类依赖
<!-- BCrypt算法 --> <dependency> <groupId>org.mindrot</groupId> <artifactId>jbcrypt</artifactId> <version>0.4</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency>
2. 编写算法类
package com.test.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.mindrot.jbcrypt.BCrypt; import org.springframework.security.crypto.password.PasswordEncoder; @Slf4j public class BCryptPasswordEncoder implements PasswordEncoder { @Override public String encode(final CharSequence password) { if (password == null) { return null; } // log.info("password = " + password ); try { final String encoded = BCrypt.hashpw(password.toString(), BCrypt.gensalt());; return encoded; } catch (final Exception e) { log.error(e.getMessage(), e); } return null; } @Override public boolean matches(final CharSequence rawPassword, final String encodedPassword) { // final String encodedRawPassword = StringUtils.isNotBlank(rawPassword) ? encode(rawPassword.toString()) : null; if (rawPassword == null) { return false; } // log.info("rawPassword = " + rawPassword ); // log.info("encodedPassword = " + encodedPassword ); final boolean matched = BCrypt.checkpw(rawPassword.toString(), encodedPassword); // StringUtils.equals(encodedRawPassword, encodedPassword); log.debug("Provided password does{}match the encoded password", BooleanUtils.toString(matched, StringUtils.EMPTY, " not ")); return matched; } }
3. 配置使用对应算法
# 默认加密策略,NONE 不加密 #cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT #cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 #cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5 # BCRYPT加密策略 cas.authn.jdbc.query[0].passwordEncoder.type=com.test.util.BCryptPasswordEncoder cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=BCRYPT
4. 修改数据库密码
可以使用BCrypt示例算法获取对应 123456 对应的密码,更新到数据库
5. 重新打包发布,使用浏览器访问
访问:http://localhost:8443/cas/,使用用户:test/123456,可以登录成功
五、CAS 认证过期字段说明
1、数据库增加字段 expired_flag,修改字段值为1
2、在application.properties中,新增配置
# 指定过期字段,0未过期,1过期(需要修改密码) cas.authn.jdbc.query[0].fieldExpired=expired_flag
3、打包发布,使用浏览器访问,登录后,提示修改密码
六、CAS 认证过期字段说明
1、数据库增加字段 disabled_flag,修改字段值为1
2、在application.properties中,新增配置
# 指定是否禁用字段,0未禁用,1禁用(账号不可用) cas.authn.jdbc.query[0].fieldDisabled=disabled_flag
3、打包发布,使用浏览器访问,登录后,提示账号被禁用了
参考:https://blog.csdn.net/wangwenke2003/article/details/80348998
参考:https://blog.csdn.net/qq_34021712/article/details/80958614