上一篇演示单点登入服务端认证机制采用的是cas server默认的用户名和密码(admin/admin)。今天介绍正常项目中如何通过验证DB中的用户数据,来验证用户的密码的合法性
自定义验证登入有两种方式:
我们上一篇博客用的最简单的SimpleTestUsernamePasswordAuthentica去验证用户名密码,而cas自带
QueryDatabaseAuthenticationHandler和SearchModeSearchDatabaseAuthenticationHandler这两个类作为JDBC方式验证用户的处理器。这两个处理类位于cas-server-support-jdbc这个扩展工程下。
1、添加cas支持db相关的jar包,以及mysql的驱动包
在D:\soft\apache-tomcat-7.0.55\tomcat_cas\webapps\cas\WEB-INF\lib目录添加下面两个jar包:
cas-server-support-jdbc-3.4.10
mysql-connector-java-3.1.12-bin.jar
2.修改cas-server相关的配置文件:
修改D:\soft\apache-tomcat-7.0.55\tomcat_cas\webapps\cas\WEB-INF\deployerConfigContext.xml文件:
找到 :
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
修改为:
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource"/>
<property name="sql" value="select password from t_user where name=?" />
<property name="passwordEncoder" ref="MD5PasswordEncoder" />
3、初始化dataSouce和定义加密器:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
bean>
<bean id="MD5PasswordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg index="0" value="MD5" />
bean>
4.在mysql数据库中用户名和密码:
5.测试
输入sso验证登入页面https://sso.kxl.com:8443/cas/login。
输入用户名和密码kxl/kxlpwd,点击登入:
补充说明:
1.导入cas-server的项目到eclipse
找到我们下载的cas-server,将目录地址…\cas\cas-server-3.4.10-release\cas-server-3.4.10\modules下的cas-server-webapp-3.4.10.war导入到我们的eclipse项目中。
2.引入相关jar包
cas-server-support-jdbc-3.4.10
mysql-connector-java-3.1.12-bin.jar复制到项目的WEB-INF/lib目录下
3.自定义一个用户验证处理器
实现自定义登录,只需要实现org.jasig.cas.authentication.handler.AuthenticationHandler接口即可,
或者继承org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler类,
比如org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler类的实现,可以参照一下。
我们自己的验证处理器就模仿QueryDatabaseAuthenticationHandler类的实现吧(这里我不重新写验证的逻辑,直接复制它里面的方法。只需要说明我们自己定义的处理器类是可用的就行。)
代码:
package com.mydefined.handler;
import javax.validation.constraints.NotNull;
import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
public class MyDefinedDBHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {
@NotNull
private String sql;
protected final boolean authenticateUsernamePasswordInternal(
UsernamePasswordCredentials credentials)
throws AuthenticationException {
System.out.println("=========我们自己的处理器=======");
String username = getPrincipalNameTransformer().transform(
credentials.getUsername());
String password = credentials.getPassword();
String encryptedPassword = getPasswordEncoder().encode(password);
try {
String dbPassword = (String) getJdbcTemplate().queryForObject(sql,
String.class, new Object[] { username });
return dbPassword.equals(encryptedPassword);
} catch (IncorrectResultSizeDataAccessException localIncorrectResultSizeDataAccessException) {
}
return false;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
4.配置文件里修改登入验证方式
项目的\WEB-INF\deployerConfigContext.xml文件中引入我们自己的处理器MyDefinedDBHander:
注意:在eclipse中给这个项目添加server,注意应该添加我们的上一篇博文里的tomcat_cas服务器,别添加其他的tomcat了,tomcat_cas里面还配置一些东西的。否则还得重新配置。
输入https://sso.kxl.com:8443/cas-server-webapp-3.4.10/login进行验证吧。用户名密码kxl/kxlpwd