sso 单点登录cas使用(2): cas 4.2.7 maven cas-overlay服务端数据库配置

2024-04-13 08:32

本文主要是介绍sso 单点登录cas使用(2): cas 4.2.7 maven cas-overlay服务端数据库配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
正式使用cas,我们不能继续从配置文件中读取配置信息,需要从数据库中读取信息来进行用户验证。

创建用户表,并插入数据

CREATE  TABLE  `t_user` (`id`  bigint(15)   NOT  NULL  COMMENT'主键',`account`  varchar(30)  DEFAULT  NULL  COMMENT'账号',`password` varchar(255)  DEFAULT  NULL  COMMENT'密码',`valid` tinyint(1)  DEFAULT  NULL COMMENT  '是否有效',PRIMARY  KEY(`id`)
) ENGINE=InnoDB   DEFAULT  CHARSET=utf8;
zhangsan MD5 加密后为01d7f40760960e7bd9443513f22ab9af
insert  into `t_user`(`id`,`account`,`password`,`valid`) values 
(25019377879351297,'zhangsan','01d7f40760960e7bd9443513f22ab9af',1);

配置cas服务端

2.1 pom.xml 加入cas-server-support-jdbc 和 mysql-connector-java的jar包


注意:本来还依赖其他jar包的(比如c3p0等),但是4.2.7的cas服务端其他jar包都有了,在本例中之需要添加上面两个包即可。

2.2 修改deployerConfigContext.xml



第一步   注释掉原来的acceptUsersAuthenticationHandler配置
  第二步   新增配置
<!--begin 从数据库中的用户表中读取 --><bean id="MD5PasswordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"autowire="byName"><constructor-arg value="MD5" /></bean><bean id="queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler"class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><property name="passwordEncoder" ref="MD5PasswordEncoder" /></bean><alias   name="dataSource"   alias="queryDatabaseDataSource"/><bean   id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"p:driverClass="com.mysql.jdbc.Driver"p:jdbcUrl="jdbc:mysql://172.16.30.34:3306/sso?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"p:user="root"p:password="root"p:initialPoolSize="6"p:minPoolSize="6"p:maxPoolSize="18"p:maxIdleTimeExcessConnections="120"p:checkoutTimeout="10000"p:acquireIncrement="6"p:acquireRetryAttempts="5"p:acquireRetryDelay="2000"p:idleConnectionTestPeriod="30"p:preferredTestQuery="select 1"/><!--end  从数据库中的用户表中读取 -->

  注意:上面需要新增的配置可以直接拷贝到你的该文件中,然后修改数据库连接串中的ip地址,数据库名称,登录账号和密码

2.3、修改cas.properties

cas4.2系列很多配置都改在了cas.properties里面了,本例中需要修改该文件。
   增加配置: cas.jdbc.authn.query.sql=select password  from  t_user  where account=? and  valid=true
注意:该SQL可以自己修改只要能根据账号查询出对应的密码字段即可,至于你的这些字段叫啥名字都没关系。

3、测试

重新打包,放入tomcat中,用户名:zhangsan 密码:zhangsan 显示登录成功

上诉代码下载 http://download.csdn.net/download/tlk20071/10027842

注意:加密算法也可以不用md5,jeesite框架的密码是散列并且加盐,所以我们校验规格那里需要修改,以下内容就是兼容jeesite的登录验证规格。

4.自定义登录验证(加密规则)

注意:我的项目是基于jeesite的,所以jeesite加密相关的类我copy过来了,但是以下内容适用于所有项目。

4.1 new Source Folder

src/main/java 和 src/main/test

4.2 修改deployerConfigContext.xml

queryDatabaseAuthenticationHandler的实现由org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler
改为了com.mryx.cas.authentication.handler.MryxQueryDatabaseAuthenticationHandler


MryxQueryDatabaseAuthenticationHandler 具体代码实现为
package com.mryx.cas.authentication.handler;import org.apache.commons.lang3.StringUtils;
import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.HandlerResult;
import org.jasig.cas.authentication.PreventedException;
import org.jasig.cas.authentication.UsernamePasswordCredential;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.stereotype.Component;import javax.security.auth.login.AccountNotFoundException;
import javax.security.auth.login.FailedLoginException;
import javax.sql.DataSource;
import javax.validation.constraints.NotNull;
import java.security.GeneralSecurityException;/*** 重写了cas的用户名密码验证处理类* @author tanlk*/
@Component("mryxQueryDatabaseAuthenticationHandler")
public class MryxQueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {@NotNullprivate String sql;@Overrideprotected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)throws GeneralSecurityException, PreventedException {if (StringUtils.isBlank(this.sql) || getJdbcTemplate() == null) {throw new GeneralSecurityException("Authentication handler is not configured correctly");}final String username = credential.getUsername();//final String encryptedPassword = this.getPasswordEncoder().encode(credential.getPassword());try {final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);//主要修改了这个地方,加入了自己的验证密码逻辑if (!CheckPassword.validatePassword(credential.getPassword(), dbPassword)) {throw new FailedLoginException("Password does not match value on record.");}} catch (final IncorrectResultSizeDataAccessException e) {if (e.getActualSize() == 0) {throw new AccountNotFoundException(username + " not found with SQL query");} else {throw new FailedLoginException("Multiple records found for " + username);}} catch (final DataAccessException e) {throw new PreventedException("SQL exception while executing query for " + username, e);}return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null);}/*** @param sql The sql to set.*/@Autowiredpublic void setSql(@Value("${cas.jdbc.authn.query.sql:}") final String sql) {this.sql = sql;}@Override@Autowired(required = false)public void setDataSource(@Qualifier("queryDatabaseDataSource") final DataSource dataSource) {super.setDataSource(dataSource);}
}

重新编译部署项目,至此完成Jeesite单点登录cas自定义登录验证

这篇关于sso 单点登录cas使用(2): cas 4.2.7 maven cas-overlay服务端数据库配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899637

相关文章

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp