mysql单点查询_CAS 实现单点登录(SSO)数据库查询认证机制

本文介绍了如何在CAS中实现自定义的数据库查询认证机制,以满足复杂登录逻辑需求。通过继承`AbstractJdbcUsernamePasswordAuthenticationHandler`并重写`authenticateUsernamePasswordInternal`方法,根据业务需求调整认证逻辑。同时,展示了如何自定义错误提示消息,通过抛出特定的`AuthenticationException`并配置本地化资源文件,实现定制化的错误信息显示。
摘要由CSDN通过智能技术生成

通过xml配置方式实现数据库查询认证,的确简单但是不够灵活。但是如果登录验证逻辑稍微复杂些,可能通过这种配置方式就不能满足需求了,比如:当用户登录时,需要判断该用户是否绑定了邮箱,如果未绑定,拒绝登录并给出提示信息。

遇到类似的情况,就需要使用自定义登录来完成,并且给出的提示信息也需要是自定义的。

自定义登录验证(默认实现QueryDatabaseAuthenticationHandler)

CAS内置了一些AuthenticationHandler实现类,如下图所示,在cas-server-support-jdbc包中提供了基于jdbc的用户认证类。

62244718_1

如果需要实现自定义登录,只需要实现org.jasig.cas.authentication.handler.AuthenticationHandler接口即可,当然也可以利用已有的实现,比如创建一个继承自org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler的类,实现方法可以参考org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler类:

62244718_2

修改authenticateUsernamePasswordInternal方法中的代码为自己的认证逻辑即可。

操作步骤:

1,Eclipse中引入cas-server-webapp项目,并在lib下添加两个jar包

62244718_3

62244718_4

2,自定义一个类,这个类的内容可以是复制QueryDatabaseAuthenticationHandler

62244718_5

类中的核心方法:

@Override

protectedfinalbooleanauthenticateUsernamePasswordInternal(finalUsernamePasswordCredentials credentials)throwsAuthenticationException {

//获取前台传递过来的值,用户名和密码

finalString username = getPrincipalNameTransformer().transform(credentials.getUsername());

finalString password = credentials.getPassword();

finalString encryptedPassword =this.getPasswordEncoder().encode(

password);

try{

/**

* 以下的代码为CAS的数据库认证默认实现,如果想编写自己的实现方式,可以删除一下代码实现自己的登录认证

*/

//sql为配置文件中配置的sql语句

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

returndbPassword.equals(encryptedPassword);

} catch(finalIncorrectResultSizeDataAccessException e) {

// this means the username was not found.

returnfalse;

}

}

3,根据业务需求编写自己的自定义登录方法,修改如下代码即可

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

returndbPassword.equals(encryptedPassword);

当然也可以访问进行

4,配置使自定义登录认证生效

62244718_6

完成以上步骤,自定义登录即可实现!

自定义错误提示消息(默认实现IncorrectResultSizeDataAccessException继承自RuntimeException)

CAS AuthenticationException结构如下图,CAS已经内置了一些异常,比如用户名密码错误、未知的用户名错误等。

62244718_7

当用户名输入正确,而密码错误时提示“密码错误”

只需要在自定义的AuthenticationHandler类的验证方法中,验证失败的地方抛出异常即可。

密码错误的异常类:

62244718_8

请注意代码中的CODE私有属性,该属性定义了一个本地化资源文件中的键,通过该键获取本地化资源中对应语言的文字,这里只实现中文错误消息提示,修改WEB-INF/classes/messages_zh_CN.properties文件,添加CODE定义的键值对,如下示例:

error.authentication.credentials.bad.usernameorpassword.password=\u5bc6\u7801\u9519\u8bef

62244718_9

后面的文字是使用jdk自带的native2ascii编码工具:native2ascii转换成utf-8格式。

62244718_10

接下来只需要在自定义的AuthenticationHandler类的验证方法中,验证失败的地方抛出异常即可。

自定义AuthenticationHandler示例代码如下:

@Override

protectedfinalbooleanauthenticateUsernamePasswordInternal(finalUsernamePasswordCredentials credentials)throwsAuthenticationException {

//获取前台传递过来的值,用户名和密码

finalString username = getPrincipalNameTransformer().transform(credentials.getUsername());

finalString password = credentials.getPassword();

finalString encryptedPassword =this.getPasswordEncoder().encode(

password);

try{

finalString dbPassword =null;

if(dbPassword ==null|| dbPassword =="") {

thrownewBadPasswordAuthenticationException();

}

returndbPassword.equals(encryptedPassword);

} catch(finalIncorrectResultSizeDataAccessException e) {

// this means the username was not found.

returnfalse;

}

62244718_11

配置使自定义错误提示生效同上(配置自定义登录认证)!

效果:

62244718_12

总结:

通过以上的学习,我们知道CAS为我们提供了很多便利的扩展功能,它的这种方式也是我们在设计软件时必须要考虑和不断要加强的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值