【CAS】自定义多条件查询配置

2024-08-25 18:48

本文主要是介绍【CAS】自定义多条件查询配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【回顾】
	在上一篇博客中,总结了cas server的自定义登录页面配置以及返回更多的用户信息给客户端,本篇博客将
总结cas server的自定义多条件查询配置。
【背景】
	在cas框架中,默认的登录验证就只是通过用户名和密码。而在实际应用中,我们也许会遇到一些其它的查
询条件,例如邮箱、手机号等也可以登录;或者我们不仅仅需要验证用户名,还需要增加某个验证条件。
【需求】
	在此项目中,因为涉及到多个租户,难免可能会有租户的用户名相同的情况存在,所以,我们需要增加一项
验证条件,即该用户所属租户的名称。
【步骤】
	1. 扩展认证条件类,增加company字段。
	在cas-server-core的源码中,定义了一个认证的类,其中声明了用户名和密码,即认证的条件。如下:
				
	增加一个条件,首先需要扩展该类,所以我们可以在此类中增加一个company字段,表示认证用户的所属
单位。代码如下:

	public class UsernamePasswordCredential implements Credential, Serializable {/** Unique ID for serialization. */private static final long serialVersionUID = -700605081472810939L;/** Password suffix appended to username in string representation. */private static final String PASSWORD_SUFFIX = "+password";/** The username. */@NotNull@Size(min=1, message = "required.username")private String username;/** The password. */@NotNull@Size(min=1, message = "required.password")private String password;/** The company. */@NotNull@Size(min=1,message = "required.company")private String company;public String getCompany() {return company;}public void setCompany(final String company) {this.company = company;}/** Default constructor. */public UsernamePasswordCredential() {}/*** Creates a new instance with the given username and password and company.** @param userName Non-null user name.* @param password Non-null password.* @param password Non-null company.*/public UsernamePasswordCredential(final String userName, final String password,final String company) {this.username = userName;this.password = password;this.company=company;}/*** @return Returns the password.*/public final String getPassword() {return this.password;}/*** @param password The password to set.*/public final void setPassword(final String password) {this.password = password;}/*** @return Returns the userName.*/public final String getUsername() {return this.username;}/*** @param userName The userName to set.*/public final void setUsername(final String userName) {this.username = userName;}/** {@inheritDoc} */@Overridepublic String getId() {return this.username;}@Overridepublic String toString() {return this.username + PASSWORD_SUFFIX;}@Overridepublic boolean equals(final Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}UsernamePasswordCredential that = (UsernamePasswordCredential) o;if (password != null ? !password.equals(that.password) : that.password != null) {return false;}if (username != null ? !username.equals(that.username) : that.username != null) {return false;} if (company != null ? !company.equals(that.company) : that.company != null) {return false;}return true;}@Overridepublic int hashCode() {int result = username != null ? username.hashCode() : 0;result = 31 * result + (password != null ? password.hashCode() : 0);return result;}}

	2. 扩展查询数据库认证类,由单条件查询扩展为多条件查询。

	在deployerConfigContext.xml文件中,我们可以发现数据库配置的处理类是
QueryDatabaseAuthenticationHandler. 该类在cas-server-support-jdbc源码中可以找到,
	那么我们的任务便是在源码中自定义一个多条件查询类,在配置文件中使用我们自己写的类去进行数据库认
证。如下:
			
	MultiQueryDatabaseAuthenticationHandler代码如下:

	public class MultiQueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler{@NotNullprivate String sql;/** {@inheritDoc} */@Overrideprotected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)throws GeneralSecurityException, PreventedException {final String username = credential.getUsername();
	//        新添加的Companyfinal String company=credential.getCompany();final String encryptedPassword = this.getPasswordEncoder().encode(credential.getPassword());try { final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, //username和company为查询条件字段username,company);if (!dbPassword.equals(encryptedPassword)) {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 + company);}} catch (final DataAccessException e) {throw new PreventedException("SQL exception while executing query for " + username + company, e);}return createHandlerResult(credential, new SimplePrincipal(username), null);}/*** @param sql The sql to set.*/public void setSql(final String sql) {this.sql = sql;}}

	3. 修改cas-server-webapp源码中的login-webflow.xml文件,增加登录页面form表单绑定的学校属性,
如下:

     

	4. 修改cas-server-webapp源码中的deployerConfigContext.xml文件,使用自定义的多条件查询认证处理
类:
	<!-- 密码加密方式--><bean id="passwordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"c:encodingAlgorithm="MD5"p:characterEncoding="UTF-8" /><bean id="dbAuthHandler"class="org.jasig.cas.adaptors.jdbc.MultiQueryDatabaseAuthenticationHandler"p:dataSource-ref="dataSource"
	      p:sql="select a.password from ta_allusers a INNER JOIN ta_registuser b 
ON a.registUserId = b.id where a.userCode=? and a.isDelete=0 and b.isDelete=0 and b.companyName=? " p:passwordEncoder-ref="passwordEncoder" />
	5. 修改结果如下,用户名、密码和学校名称三个条件认证成功,才能登录:
			
	用户名和密码正确,但学校名称不正确,无法登录:

			
【总结】
	修改认证条件,这也应该是实际应用中常见的问题。我们在平时使用其他软件的时候,也可以感受到,用户
登录的条件不仅仅只有用户名一种,也可以利用自己注册时的手机号或邮箱进行认证。多一种方式,也给用户多了提
供了一份便利。不论是“或”还是“与”条件,则必然需要对其源代码进行扩展。从源码中可以进一步帮助我们理解
此框架流程,阅读源码也是一种升华。


这篇关于【CAS】自定义多条件查询配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1106365

相关文章

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并