前期准备
已经搭建好了集成了CAS客户端的应用系统和CAS服务器
1.应用系统webapp(http://127.0.0.1:8090/webapp/main.do)
2.CAS单点登录服务器端(http://127.0.0.1:8081/cas-server/)
本次讨论包括CAS单点登录服务器端的部分源码,以及在此基础上进行用户认证二次开发,因此需要修改部分CAS服务器端的源码,源码部分的修改在下面进行讨论。关于CAS客户端、CAS服务器端和CAS单点登出的源码分析,请参考另外三篇文章
CAS客户端:http://blog.csdn.net/dovejing/article/details/44426547
CAS服务器端:http://blog.csdn.net/dovejing/article/details/44523545
CAS单点登出:http://blog.csdn.net/dovejing/article/details/44675647
deployerConfigContext.xml部分代码
CAS服务器端的用户认证,默认采用SimpleTestUsernamePasswordAuthenticationHandler类,当输入的用户名和密码相同时,视为认证通过。但实际情况我们会根据需求需要增加自己的用户认证功能,首先在deployerConfigContext.xml配置文件中增加数据源的配置信息(mysql)。
deployerConfigContext.xml部分代码
/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp
修改deployerConfigContext.xml配置文件,注解默认的认证配置和默认的attributeRepository配置信息,增加用户自己的认证配置和attributeRepository配置。
- 初始化QueryDatabaseAuthenticationHandler类的sql属性(SELECT PASSWORD FROM USER),引用数据源dataSource(mysql数据源),初始化passwordEncode属性(MD5PasswordEncoderr密码加密类)。此处的sql属性只是一个简单的查询语句,实际应用中可以定义一个复杂的SQL语句。
- 增加自己的attributeRepository配置。dataScore和SELECT * FROM USER WHERE {0}为SingleRowJdbcPersonAttributeDao构造方法的两个参数,queryAttributeMapping是为了组装SQL(SELECT * FROM USER WHERE LOGIN_NAME=username),resultAttributeMapping是SQL查询返回结果属性。
修改casServiceValidationSuccess.jsp页面,由于默认的页面只有user的信息,并没有attributes的信息,因此我们需要增加该信息,本文中只增加了mobile和email,实际应用中可根据需要增加多个属性信息。
该页面最终的返回结果如下:
客户端获取用户认证的信息的代码
QueryDatabaseAuthenticationHandler的authenticateUsernamePasswordInternal方法
QueryDatabaseAuthenticationHandler的authenticateUsernamePasswordInternal方法,要做的就是获取用户输入的用户名和密码,用配置文件中配置的加密方式(MD5PasswordEncoder类)进行加密,用加密后的密码encryptedPassword和用SQL语句在数据库中查询的密码(dbPassword)进行对比,并返回结果。
MD5PasswordEncoder类
MD5PasswordEncoder类,要做的就是对用户输入的密码进行加密。此类是新增加的类,用户可以增加任何有加密逻辑的类,但此类必须实现org.jasig.cas.authentication.handler.PasswordEncoder接口,并实现String encode(String password)方法。
至此,CAS用户认证的修改已经完成。