单点登录CAS5-服务端通过数据库认证用户

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 原理实现方式有两种一是自己写数据库获取用户名密码再认证的类一是借助CAS自带的JDBC支持来实现认证自己写认证类(推荐)1、CSA的默认登录用户密码配置在deployerConfigContext.

原理

实现方式有两种

一是自己写数据库获取用户名密码再认证的类

一是借助CAS自带的JDBC支持来实现认证

自己写认证类(推荐)

1、CSA的默认登录用户密码配置在deployerConfigContext.xml,所以就到deployerConfigContext.xml里面找可以找到

   

  我们在AcceptUsersAuthenticationHandler.java中发现CAS是把配置的用户密码读取到全局Map中的

2、而AcceptUsersAuthenticationHandler.java是通过继承

AbstractUsernamePasswordAuthenticationHandler.java才实现的认证所以创建

com.jadyer.sso.authentication.UserAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler

  再重写authenticateUsernamePasswordInternal()方法,

在里面获取到前台页面输入的用户密码,再到数据库中校验就行了

3、接下来创建\WEB-INF\spring-configuration\applicationContext-datasource.xml

  它会在启动时被自动加载(web.xml中设定的)

  然后在里面配置数据库连接池,连接池的用户名密码等可以配置在\WEB-INF\cas.properties

  同时增加,使得可以在自定义类中应用Spring注解

4、新建一个UserDaoJdbc.java类,通过它利用SpringJDBCTemplate访问数据库

  因为要连接数据库,所以还要把druid-1.0.14.jar以及mysql-connector-java-5.1.35.jar加入到lib目录中

5、最后记得deployerConfigContext.xml里面把这段Bean配置给注释掉

    并在自定义的UserAuthenticationHandler.java中使用

@Component(value="primaryAuthenticationHandler")声明其为Bean,注意其名字应该是primaryAuthenticationHandler,因为deployerConfigContext.xml的其它配置引用了primaryAuthenticationHandler

  否则你还要找到引用了primaryAuthenticationHandler的位置修改为新的Bean

cas-server-support-jdbc

1、这一种方式就简单一些了,先引入c3p0-0.9.1.2.jar以及cas-server-support-jdbc-4.0.3.jar

2、修改deployerConfigContext.xml,注释掉

  并增加(下方会贴出具体代码)

  同样这里也是从cas.properties读取的数据库连接用户密码

3、由于在认证过程中是通过引用了来实现的

  所以修改这里的primaryAuthenticationHandler为我们新建的mssoUsersAuthenticationHandler

4、通过查看org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler源码会发现

  这与上面自己写认证类的方式,原理一样,都是直接或间接的扩展AbstractUsernamePasswordAuthenticationHandler

代码

本文源码下载:(下面两个地址的文件的内容,都是一样的)

http://download.csdn.net/detail/jadyer/8911139

下面是新创建的\WEB-INF\spring-configuration\applicationContext-datasource.xml



    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
        
    
    

    

下面是cas.properties中新添加的数据库元信息的配置

#<<数据库元信息>>
jdbc.url=jdbc:mysql://192.168.2.41:3306/turtle?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false
jdbc.username=turtle
jdbc.password=turtle

下面是自定义的UserDaoJdbc.java

package com.jadyer.sso.authentication;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class UserDaoJdbc {
    private static final String SQL_VERIFY_ACCOUNT = "SELECT COUNT(*) FROM permission_operator WHERE operator_login=? AND operator_pwd=SHA1(?)";
    private JdbcTemplate jdbcTemplate;
    @Resource
    public void setDataSource(DataSource dataSource){
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    public boolean verifyAccount(String username, String password){
        try{
            //验证用户名和密码是否正确
            return 1==this.jdbcTemplate.queryForObject(SQL_VERIFY_ACCOUNT, new Object[]{username, password}, Integer.class);
        }catch(EmptyResultDataAccessException e){
            return false;
        }
    }
}

下面是自定义的用户登录认证类UserAuthenticationHandler.java

package com.jadyer.sso.authentication;
import java.security.GeneralSecurityException;
import javax.annotation.Resource;
import javax.security.auth.login.FailedLoginException;
import org.jasig.cas.authentication.HandlerResult;
import org.jasig.cas.authentication.PreventedException;
import org.jasig.cas.authentication.UsernamePasswordCredential;
import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.principal.SimplePrincipal;
import org.springframework.stereotype.Component;

/**
 * 自定义的用户登录认证类
 */
@Component(value="primaryAuthenticationHandler")
public class UserAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler {
    @Resource
    private UserDaoJdbc userDaoJdbc;
    @Override
    protected HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential transformedCredential) throws GeneralSecurityException, PreventedException {
        //UsernamePasswordCredential参数包含了前台页面输入的用户信息
        String username = transformedCredential.getUsername();
        String password = transformedCredential.getPassword();
        //认证用户名和密码是否正确
        if(userDaoJdbc.verifyAccount(username, password)){
            return createHandlerResult(transformedCredential, new SimplePrincipal(username), null);
        }
        throw new FailedLoginException();
    }
}

最后是deployerConfigContext.xml中的改动部分





    
        
            
            
            
            
        
    
    
        
    



 

将不定期更新资源,欢迎持续关注


想获得更多的学习知识请关注微信公众号:西北码农或扫下方二维码

 

 

 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10月前
|
关系型数据库 MySQL 数据库连接
Python+SQLite数据库实现服务端高并发写入
Python中使用SQLite内存模式实现高并发写入:创建内存数据库连接,建立表格,通过多线程并发写入数据。虽然能避免数据竞争,但由于SQLite内存模式采用锁机制,可能在高并发时引发性能瓶颈。若需更高性能,可选择MySQL或PostgreSQL。
422 0
|
Go 数据库 开发工具
【博客开发】服务端概要设计-数据库设计
【博客开发】服务端概要设计-数据库设计
117 0
|
缓存 NoSQL 关系型数据库
服务端通过nosql加锁解决并发问题实战
服务端通过nosql加锁解决并发问题实战
151 0
|
存储 Unix 关系型数据库
聊聊我们服务端数据库存储时间的几种格式
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
491 0
|
数据库 图形学
Unity3D MMORPG源码+资源+服务端+数据库(Unity3D)
本文转自:GameRes游资网 原文作者:zhihudaye 原文链接:bbs.gameres.com/forum.php?m…
|
存储 Oracle 关系型数据库
Linux 系统服务端oracle19c数据库全英文版安装教程
Linux 系统服务端oracle19c数据库全英文版安装教程
857 0
Linux 系统服务端oracle19c数据库全英文版安装教程
|
存储 安全 算法
IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议
本文正文部分引用了58同城架师沈剑的文章,非常感谢他的分享。 1、前言 IM应用从服务端数据的角度来看,它是一种很特殊的应用场景,抛开基础数据、增值业务和附属功能不谈,单从IM聊天工具的立身之本——聊天数据来说,理论上是不需要在服务端存储的(或者说只需要短暂存储——比如离线消息,上线即拉走),这也是为什么微信在前段时间号称绝不存储用户聊天数据的原因(从技术上说这不是没有道理的,但到底有没有存储,这已经超越技术范畴了,不在此文讨论之列 ^_^)。
2631 0
|
存储 NoSQL 关系型数据库
1.非关系型数据库(Nosql)之mongodb:mongodb的安装,环境变量配置,数据库服务端启动,客户端启动
 1.MongoDB官方网站上下载MongoDB的安装版本。截图如下: 2 安装64位版本的mongodb。将它解压到: E:\Installed\mongodb-win32-x86_64-2.6.4 bin目录 3将bin的位置配置到环境变量 4启动mongodb数据库,怎么通过客户端连接数据库,跟mongo
1444 0
|
4天前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
104 82
|
2月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决

热门文章

最新文章