Apereo CAS 5.0.X中为我们提供了四种基于JDBC的AuthenticationHandler的实现,在cas-server-support-jdbc子模块中,下面一一对他们进行介绍。

Query

配置一个SQL语句,该SQL可以通过传入的用户名查询返回该用户的密码,然后与用户输入的密码进行比较,进行比较之前,可以配置加密过程。匹配结果将作为认证结果,如果对应的用户名不存在也将返回false。

@Override

protected HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential, final String originalPassword)

throws GeneralSecurityException, PreventedException {

if (StringUtils.isBlank(this.sql) || getJdbcTemplate() == null) {

throw new GeneralSecurityException("Authentication handler is not configured correctly. "

+ "No SQL statement or JDBC template is found.");

}

final String username = credential.getUsername();

final String password = credential.getPassword();

try {

final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);

if ((StringUtils.isNotBlank(originalPassword) && !this.matches(originalPassword, dbPassword))

|| (StringUtils.isBlank(originalPassword) && !StringUtils.equals(password, 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");

}

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);

}

QueryAndEncode

跟上边一样的模式,不过密码再加密的时候可以配置加盐处理。

@Override

protected HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential transformedCredential)

throws GeneralSecurityException, PreventedException {

if (StringUtils.isBlank(this.sql) || StringUtils.isBlank(this.algorithmName) || getJdbcTemplate() == null) {

throw new GeneralSecurityException("Authentication handler is not configured correctly");

}

final String username = transformedCredential.getUsername();

try {

final Map values = getJdbcTemplate().queryForMap(this.sql, username);

final String digestedPassword = digestEncodedPassword(transformedCredential.getPassword(), values);

if (!values.get(this.passwordFieldName).equals(digestedPassword)) {

throw new FailedLoginException("Password does not match value on record.");

}

return createHandlerResult(transformedCredential,

this.principalFactory.createPrincipal(username), null);

} 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);

}

}

SearchModeSearch

通过查询指定的表的指定的用户名和指定的密码的记录是否存在来判断是否验证通过。

@Override

protected HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)

throws GeneralSecurityException, PreventedException {

String sql = null;

if (StringUtils.isNotBlank(tableUsers) || StringUtils.isNotBlank(fieldUser) || StringUtils.isNotBlank(fieldPassword)) {

sql = "SELECT COUNT('x') FROM ".concat(this.tableUsers).concat(" WHERE ").concat(this.fieldUser)

.concat(" = ? AND ").concat(this.fieldPassword).concat("= ?");

}

if (StringUtils.isBlank(sql) || getJdbcTemplate() == null) {

throw new GeneralSecurityException("Authentication handler is not configured correctly. "

+ "No SQL statement or JDBC template found");

}

final String username = credential.getUsername();

try {

logger.debug("Executing SQL query {}", sql);

final int count = getJdbcTemplate().queryForObject(sql, Integer.class, username, credential.getPassword());

if (count == 0) {

throw new FailedLoginException(username + " not found with SQL query.");

}

return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null);

} catch (final DataAccessException e) {

throw new PreventedException("SQL exception while executing query for " + username, e);

}

}

BindModeSearch

将试图以传入的用户名和密码从配置的DataSource中建立一个连接,如果连接成功,则表示认证成功,否则就是认证失败。

protected HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)

throws GeneralSecurityException, PreventedException {

if (getDataSource() == null) {

throw new GeneralSecurityException("Authentication handler is not configured correctly");

}

Connection connection = null;

try {

final String username = credential.getUsername();

final String password = credential.getPassword();

connection = this.getDataSource().getConnection(username, password);

return createHandlerResult(credential, this.principalFactory.createPrincipal(username), null);

} catch (final SQLException e) {

throw new FailedLoginException(e.getMessage());

} catch (final Exception e) {

throw new PreventedException("Unexpected SQL connection error", e);

} finally {

if (connection != null) {

DataSourceUtils.releaseConnection(connection, this.getDataSource());

}

}

}

apereo cas mysql_Apereo CAS 5.0.X 默认提供的数据库认证的四种方式相关推荐

  1. Apereo CAS 5.0.X 默认提供的数据库认证的四种方式

    Apereo CAS 5.0.X中为我们提供了四种基于JDBC的AuthenticationHandler的实现,在cas-server-support-jdbc子模块中,下面一一对他们进行介绍. Q ...

  2. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)

    活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...

  3. Django视图层:嵌套参数,URLconf在查找什么?指定视图参数的默认值、include()路由转发三种方式、传递额外选项给 include()、传递额外选项给视图

    一.视图层The view layer Django 具有 "视图" 的概念,负责处理用户的请求并返回响应. 二.嵌套参数Nested arguments 正则表达式允许嵌套参数, ...

  4. keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全 ...

  5. STM32实现0.96寸OLED显示模拟IIC和IIC四种实现(标准库和HAL库)

    目录 本文通过四种方法实现OLED显示 设备选择 OLED介绍 接线表设计 OLED应用 1.标准库模拟IIC实现OLED显示 2.标准库IIC实现OLED显示 3.HAL库模拟IIC实现OLED显示 ...

  6. 自定义http报头_为HttpClient添加默认请求报头的四种解决方案

    前言 HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式.下面话不多说了,来一起看看详细的介绍吧 第一种 ...

  7. Apereo CAS 5.0.X 配置数据库认证方式

    Apereo CAS 5.0.X 使用Spring Boot的方式重构了项目,配置也发生了很大的变化.配置文件都在cas项目下的WEB-INF/classes目录下面,配置文件较多,后边详细说,这里先 ...

  8. SSO(CAS)和Oauth2.0区别和原理

    简介和区别 SSO, single sign on,单点登录.sso多用于多个应用之间的切换,例如百度论坛.百度知道.百度云.百度文库等,在其中一个系统中登录, 切换到另一个系统的时候,不必再次输入用 ...

  9. 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)

    1.对象头 Java对象头里的Mark Word里默认存储对象的HashCode.分代年龄和锁标记位. 32位JVM的Mark Word的默认存储结构如下图所示: 在运行期间,Mark Word里存储 ...

最新文章

  1. C++使用ICE实现两台主机通信实例
  2. 谁还期待iPhone 13?
  3. 核心频率个加速频率_仅少数Ryzen 9 3900X能摸到官方最大加速频率,其他处理器也有这问题...
  4. python 比例之差z假设检验_假设检验在数据分析中的应用
  5. Oracle hang 之sqlplus -prelim使用方法
  6. ffmpeg和SDL学习笔记
  7. Python3 hex() 函数
  8. jQuery在线选座订座(影院篇)
  9. 升级macOS Big Sur 无法开机/死机怎么办?
  10. 【Linux】ubuntu锐捷客户端连接四川大学校园网
  11. python 2.7安装pandas失败
  12. python 立方体切割块数_用参数化su计算立方体切割体积
  13. python模拟登陆qq空间
  14. GODOT游戏编程001
  15. 异名一文带你读懂Chrome小恐龙跑酷!
  16. 那些年,Linus torvalds大神喷过的技术
  17. Nginx网页优化(隐藏版本号,日志分割,更改进程数,网页压缩,防盗链详
  18. 【FPGA学习笔记】VHDL语言(五)语言风格描述:行为描述,数据流描述,结构化描述
  19. 使用分治法解最大连续子序列和问题
  20. 【图解算法使用C++】1.2 生活中的算法

热门文章

  1. jsp button提交表单
  2. 如何将视频下载并且转码拼接
  3. 美图HTTPS优化探索与实践
  4. java 内存模型 ——学习笔记
  5. mysql innodb和myisam比较
  6. 英媒:滴滴和优步每年烧钱64亿
  7. linux系统下如何禁止ping命令或允许ping命令的方法
  8. 当DRM出错时的解决办法
  9. Java继承、重写与重载 笔记
  10. java设计模式之外观模式(门面模式)