cas登陆页定义异常提示(中英文等):
两种异常的处理方式不同,1,是通过配置文件指定用哪个异常类和方法 2,是通过继承AuthenticationViaFormAction类实现(见后文)
不同异常的提示,区分中英文
1, 定义好自定义异常
2,在执行异常的地方抛出
3,定义好捕捉异常的处理器
property属性文件:
authenticationFailure.AccountNotFoundException=户名或密码错误.
authenticationFailure.FailedLoginException=户名或密码错误.
authenticationFailure.AccountNotFoundExceptionEn=Invalid credentials.
authenticationFailure.FailedLoginExceptionEn=Invalid credentials.
1, 定义好自定义异常
package org.esteels.cas.validator;
import javax.security.auth.login.LoginException;
/**
* Signals that user authentication failed.
*
* <p> This exception is thrown by LoginModules if authentication failed.
* For example, a <code>LoginModule</code> throws this exception if
* the user entered an incorrect password.
*
*/
public class FailedLoginExceptionEn extends LoginException {
private static final long serialVersionUID = 802556922354616286L;
/**
* Constructs a FailedLoginException with no detail message. A detail
* message is a String that describes this particular exception.
*/
public FailedLoginExceptionEn() {
super();
}
/**
* Constructs a FailedLoginException with the specified detail
* message. A detail message is a String that describes this particular
* exception.
*
* <p>
*
* @param msg the detail message.
*/
public FailedLoginExceptionEn(String msg) {
super(msg);
}
}
2,在执行异常的地方抛出(这里覆写后要修改配置文件引用此类的路径)
public class QueryDatabaseAuthenticationHandler
extends AbstractJdbcUsernamePasswordAuthenticationHandler
{
{
@NotNull
private String sql;
protected final HandlerResult authenticateUsernamePasswordInternal(UsernamePasswordCredential credential)
throws GeneralSecurityException, PreventedException
{
RemembermeAndCaptcha cuCredential = (RemembermeAndCaptcha) credential;
String username = credential.getUsername();
int webflag= cuCredential.getWebflag();
String encryptedPassword = getPasswordEncoder().encode(credential.getPassword());
try {
String dbPassword = (String)getJdbcTemplate().queryForObject(this.sql, String.class, new Object[] { username });
if (!dbPassword.equals(encryptedPassword)) {
if(webflag==0){///中英文
throw new FailedLoginException("Password does not match value on record.");//哪种异常
}else{
throw new FailedLoginExceptionEn("Password does not match value on record.");
}
}
} catch (IncorrectResultSizeDataAccessException e) {
if (e.getActualSize() == 0) {
throw new AccountNotFoundException(username + " not found with SQL query");
}
throw new FailedLoginException("Multiple records found for " + username);
}
catch (DataAccessException e) {
throw new PreventedException("SQL exception while executing query for " + username, e);
}
return createHandlerResult(credential, new SimplePrincipal(username), null);
}
3,定义好捕捉异常的处理器
public class AuthenticationExceptionHandler
{
private static final String UNKNOWN = "UNKNOWN";
private static final String DEFAULT_MESSAGE_BUNDLE_PREFIX = "authenticationFailure.";
private static final List<Class<? extends Exception>> DEFAULT_ERROR_LIST = new ArrayList();
private final Logger logger = LoggerFactory.getLogger(getClass());
static {
DEFAULT_ERROR_LIST.add(AccountLockedException.class);
DEFAULT_ERROR_LIST.add(FailedLoginException.class);
DEFAULT_ERROR_LIST.add(CredentialExpiredException.class);
DEFAULT_ERROR_LIST.add(AccountNotFoundException.class);
DEFAULT_ERROR_LIST.add(AccountDisabledException.class);
DEFAULT_ERROR_LIST.add(InvalidLoginLocationException.class);
DEFAULT_ERROR_LIST.add(InvalidLoginTimeException.class);
DEFAULT_ERROR_LIST.add(FailedLoginExceptionEn.class);
DEFAULT_ERROR_LIST.add(AccountNotFoundExceptionEn.class);
}
}
cas-servlet.xml:
<bean id="authenticationExceptionHandler" class="org.esteels.cas.authentication.AuthenticationExceptionHandler" />//类中要增加比对哪些异常(复写)
AuthenticationExceptionHandler这个源码里面根据异常类名拼接配置属性,并获取值
<action-state id="handleAuthenticationFailure">
<evaluate expression="authenticationExceptionHandler.handle(currentEvent.attributes.error, messageContext)" />
<transition on="AccountDisabledException" to="casAccountDisabledView"/>
<transition on="AccountLockedException" to="casAccountLockedView"/>
<transition on="CredentialExpiredException" to="casExpiredPassView"/>
<transition on="InvalidLoginLocationException" to="casBadWorkstationView"/>
<transition on="InvalidLoginTimeException" to="casBadHoursView"/>
<transition on="FailedLoginException" to="generateLoginTicket"/>
<transition on="AccountNotFoundException" to="generateLoginTicket"/>
<transition on="FailedLoginExceptionEn" to="generateLoginTicket"/>
<transition on="AccountNotFoundExceptionEn" to="generateLoginTicket"/>
<transition on="UNKNOWN" to="generateLoginTicket"/>
</action-state>
<action-state id="realSubmit">
<evaluate expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credential, messageContext)" />
<transition on="warn" to="warn" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="successWithWarnings" to="showMessages" />
<transition on="authenticationFailure" to="handleAuthenticationFailure" />
<transition on="error" to="generateLoginTicket" />
</action-state>
<action-state id="generateServiceTicket">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to ="warn" />
<transition on="authenticationFailure" to="handleAuthenticationFailure" />
<transition on="error" to="generateLoginTicket" />
<transition on="gateway" to="gatewayServicesManagementCheck" />
</action-state>
被注入的这个到那个视图
<action-state id="generateLoginTicket">
<evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
<transition on="generated" to="viewLoginForm" />
</action-state>
这个视图有什么属性
<view-state id="viewLoginForm" view="casLoginView" model="credential">
<binder>
<binding property="username" />
<binding property="password" />
<!-- 增加验证码属性 -->
<binding property="captcha" />
<!-- 增加rememberMe属性 -->
<binding property="rememberMe" />
<!-- 判断中英文网站 -->
<binding property="webflag" />
</binder>
<on-entry>
<set name="viewScope.commandName" value="'credential'" />
</on-entry>
<transition on="submit" bind="true" validate="true" to="EsteelsValidator"><!-- 自定义验证 -->
<evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credential)" />
</transition>
</view-state>
相关推荐
详细描述了cas 自定义登陆页面的配置与demo
cas替换登陆页面配置步骤,可手动配置替换cas server的登陆界面
本项目用于实际单点登录项目中集成cas修改项目登录页,直接解压项目导入ecliplse即可以使用,脚本用原来自带的就可以
用的java语言后台连接CAS登陆验证的工具类 特点: 1、无需修改CAS服务端的代码 2、能够自动获取ticket等参数值 3、这是一个工具类调用非常方便,不光适用于java也适用于android, 其他语言也可以参考,注释写的非常...
myEclipse下含源码,在struts2下集成cas实现单点登陆的例子,例子虽然简单,基本上反映出cas的工作原理!
让CAS支持客户端自定义登陆页面——服务器篇[参考].pdf
基于CAS的单点登录系统,可以通过这些步骤来实现不同系统展示不同的登录页,但是登录后的信息共享
cas单点登陆, 在生活中我们也有类似的相关生活经验,例如你去食堂吃饭,食堂打饭的阿姨(www.qiandu.com)告诉你,不收现金。并且告诉你,你去门口找换票的(passport.com)换小票。于是你换完票之后,再去找食堂...
CAS 是 Yale (耶鲁)大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠...•CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
H3C CAS系统维护 H3C CAS日志维护 H3C CAS案例集 H3C CAS主机异常问题定位介绍 H3C CAS系统变更要求 H3C CAS版本升级方案介绍 H3C CAS系统命令
该资源是CAS单点登陆所需的项目,包含CAS-server-4.2.4、CAS-client-3.2.1,配合我的一篇名为CAS单点登陆实例的博客一起实操,https://blog.csdn.net/Candy_Sir/article/details/90238063 相信小伙伴一定成功搭建...
CAS单点登陆资料CAS单点登陆资料包括配置步骤及JAR
cas客户端登录配置详细文档,支持客户端自定义登录和服务端统一登录。
包含cas源码、cas使用说明文档(包含配置信息)、连接数据库所需jar包、cas服务端自定义返回值等
CAS介绍资源页面 系列介绍了CAS框架原理及使用
cas6.3版本 tomcat环境准备好,mysql设置成application.properties中提示,thekeystore自己生成放入tomcat并需要在jdk中导入证书
cas4.0版本的 单点登录 自定义页面。希望对你有用,最低资源分,辛苦分。有问题可以交流学习。谢谢
让CAS支持客户端自定义登陆页面----服务器篇--.doc
cas源码修改-登录页面
基于springboot,cas,shiro,pac4j,实现cas rest接口获取ticket,不再跳转cas server登录页