JAVA CAS单点登录之四:CAS服务器增加JDBC访问能力

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dba10g.blog.51cto.com/764602/1753680

经过前面说明,已经完成了CAS服务器的搭建,代理客户端的搭建以及普通客户端,back-end-service客户端的搭建。如果不明白的,参照如下链接。

JAVA CAS单点登录之一:搭建CAS服务器 

JAVA CAS单点登录之二:CAS普通模式1演练

JAVA CAS单点登录之三:CAS代理模式演练 

现在的CAS服务器认证功能弱到爆了,使用模式自带的认证Handler,用在模拟测试玩玩上课,用在系统中,压根还不行。这一节,咱们就增加这一方面的功能。

主要内容

1.用户名和密码从数据库中读取(用户量有保障)

2.密码保障


前言

    咱们知道CAS默认提供的认证服务,只需要输入的用户名和密码相同,即可通过认证。咱们先要找到这一块的配置信息。

在deployerConfigContext.xml中找到代码片段如下

1
< bean   class = "org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public  final  class  SimpleTestUsernamePasswordAuthenticationHandler  extends
     AbstractUsernamePasswordAuthenticationHandler {
 
     public  SimpleTestUsernamePasswordAuthenticationHandler() {
         log
             .warn( this .getClass().getName()
                 " is only to be used in a testing environment.  NEVER enable this in a production environment." );
     }
 
     public  boolean  authenticateUsernamePasswordInternal( final  UsernamePasswordCredentials credentials) {
         final  String username = credentials.getUsername();
         final  String password = credentials.getPassword();
 
         if  (StringUtils.hasText(username) && StringUtils.hasText(password)
             && username.equals(getPasswordEncoder().encode(password))) {
             log
                 .debug( "User ["  + username
                     "] was successfully authenticated." );
             return  true ;
         }
 
         log.debug( "User ["  + username +  "] failed authentication" );
 
         return  false ;
     }
}

通过分析代码,应该很容易看明白。如果大家对面向接口编程有一定了解的话,就应该知道咱们下一步是做什么了。重点分析SimpleTestUsernamePasswordAuthenticationHandler 的结构树。

wKiom1bwAqjg3qrSAABsIh34ASU266.png

这时候应该留意到了QueryDatabaseAuthenticationHandler这个类,没错。接下来的这一章的过程实质上就是一步步将SimpleTestUsernamePasswordAuthenticationHandler替换为QueryDatabaseAuthenticationHandler的过程。


  1. 添加依赖(cas jdbc支持包,及数据库驱动)

    修改pom.xml,增加2个依赖。

  org.jasig.cas
  cas-server-support-jdbc
  3.5.3



  mysql
  mysql-connector-java
  5.1.38

如果要使用commons-dbcp的话,请自行添加以下依赖

  • commons-collections-3.2.jar

  • commons-dbcp-1.2.1.jar

  • commons-pool-1.3.jar

2.修改deployerConfigContext.xml文件

准备数据库环境

1
2
3
4
5
6
7
8
9
10
DROP  TABLE  IF EXISTS `t_users`;
CREATE  TABLE  `t_users` (
   `user_name`  varchar (32)  DEFAULT  NULL ,
   ` password varchar (64)  DEFAULT  NULL
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8;
 
-- ----------------------------
-- Records of t_users
-- ----------------------------
INSERT  INTO  `t_users`  VALUES  ( 'jdbc_user' 'jdbc_password' );

密码暂时是明文


2.1 注释掉SimpleTestUsernamePasswordAuthenticationHandler

1
<!--<bean  class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/>-->

2.2增加QueryDatabaseAuthenticationHandler相关配置

1
2
3
4
5
6
7
8
9
10
11
12
< bean  id = "authenticationManager"
       class = "org.jasig.cas.authentication.AuthenticationManagerImpl" >
       ...
      < property  name = "authenticationHandlers"
      < list >
< bean  class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" >
     < property  name = "dataSource"  ref = "dataSource"  />
     < property  name = "sql"  value = "select password from t_users where lower(user_name) = lower(?)"  />
</ bean >
</ list >
</ property >
</ bean >

其中,没有考虑加密处理,别急,一步步来。

到这一步就把JDBC集成到CAS服务了了。

2.3.验证,输入jdbc_user/jdbc_password,认证通过。

2.4增加密码认证功能,上面的结构树大家如果注意到了passwordEncoder属性,接下来就应该知道怎么了。没错为QueryDatabaseAuthenticationHandler的passwordEncoder属性赋值

2.5 完整配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
...
< bean  id = "authenticationManager"
       class = "org.jasig.cas.authentication.AuthenticationManagerImpl" >
 
 
     < property  name = "credentialsToPrincipalResolvers" >
         < list >
 
             < bean  class = "org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
                 < property  name = "attributeRepository"  ref = "attributeRepository" />
             </ bean >
  
             < bean
                     class = "org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
         </ list >
     </ property >
 
 
     < property  name = "authenticationHandlers" >
         < list >
   
             < bean  class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
                   p:httpClient-ref = "httpClient"  p:requireSecure = "false" />
 
             <!--
             <bean  class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/>
             -->
             < bean  class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" >
                 < property  name = "dataSource"  ref = "dataSource"  />
                 < property  name = "sql"  value = "select password from t_users where lower(user_name) = lower(?)"  />
                 < property  name = "passwordEncoder"  ref = "passwordEncoder" />
             </ bean >
         </ list >
     </ property >
</ bean >
< bean  id = "passwordEncoder"  class = "org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  p:characterEncoding = "UTF-8"  >
     < constructor-arg  index = "0"  value = "MD5"  />
</ bean >
<!-- Data source definition -->
< bean  id = "dataSource"  class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
     < property  name = "driverClassName" >
         < value >com.mysql.jdbc.Driver</ value >
     </ property >
     < property  name = "url" >
         < value >jdbc:mysql://localhost:3306/exampledb</ value >
     </ property >
     < property  name = "username" >
         < value >root</ value >
     </ property >
     < property  name = "password" >
         < value >root</ value >
     </ property >
</ bean >
...

2.6 认证

这时候需要手动改一下数据库记录的密码了

apple 对应的MD5字符串是1f3870be274f6c49b3e31a0c6728957f。

也可以执行如下语句

1
INSERT  INTO  `t_users`  VALUES  ( 'jdbc_user' '1f3870be274f6c49b3e31a0c6728957f' );

2.7 重启服务器,输入jdbc_user/apple ,认证通过。


最后,其他数据库的话,可以如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!-- Oracle connector -->
< bean  id = "dataSource"  class = "org.apache.commons.dbcp.BasicDataSource" >
  < property  name = "driverClassName" >
   < value >oracle.jdbc.driver.OracleDriver</ value >
  </ property >
  < property  name = "url" >
   < value >jdbc:oracle:thin:@database-server-name:1521:SID</ value >
  </ property >
  < property  name = "username" >
   < value >admusr</ value >
  </ property >
  < property  name = "password" >
   < value >admpwd</ value >
  </ property >
</ bean >
  
<!-- MySQL connector -->
< bean  id = "dataSource"  class = "org.apache.commons.dbcp.BasicDataSource" >
  < property  name = "driverClassName" >
   < value >com.mysql.jdbc.Driver</ value >
  </ property >
  < property  name = "url" >
   < value >jdbc:mysql://database-server-name:3306/db-name</ value >
  </ property >
  < property  name = "username" >
   < value >admusr</ value >
  </ property >
  < property  name = "password" >
   < value >admpwd</ value >
  </ property >
</ bean >
  
  
<!-- PostgreSQL connector -->
< bean  id = "dataSource"  class = "org.apache.commons.dbcp.BasicDataSource" >
  < property  name = "driverClassName" >
   < value >org.postgresql.Driver</ value >
  </ property >
  < property  name = "url" >
   < value >jdbc:postgresql://database-server-name:5432/db-name</ value >
  </ property >
  < property  name = "username" >
   < value >admusr</ value >
  </ property >
  < property  name = "password" >
   < value >admpwd</ value >
  </ property >
</ bean >

参考链接

https://wiki.jasig.org/display/CASUM/Using+JDBC+for+Authentication

https://wiki.jasig.org/display/CASUM/JDBC

https://wiki.jasig.org/display/CAS/Examples+to+Configure+CAS


 

一步步走下来,一点也不难。祝好运。


本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1753680

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
1天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
3天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
26天前
|
Java 关系型数据库 MySQL
Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
【2月更文挑战第33天】Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
46 2
|
29天前
|
Java
Java包及访问限定
Java包及访问限定
8 0
|
29天前
|
SQL Java 关系型数据库
Java数据库访问
Java数据库访问
|
1月前
|
存储 人工智能 Java
Java的数组访问
Java的数组访问
13 0
|
2月前
|
Java
java上传、下载、预览、删除ftp服务器上的文件
java上传、下载、预览、删除ftp服务器上的文件
|
2月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现