H__D  

一、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);
    }
}
View Code

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

posted on 2024-11-07 01:26  H__D  阅读(4)  评论(0编辑  收藏  举报