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服务器的配置文件(如`cas.properties`或`application.yml`,取决于你的CAS版本)中,找到`cas.server.loginUrl`或`server.servlet.context-path/login`配置项,将其修改为你自定义登录页面的URL。例如: ```...
cas替换登陆页面配置步骤,可手动配置替换cas server的登陆界面
让CAS支持客户端自定义登陆页面需要在服务器端进行修改,包括添加新的处理器映射、控制器和流程执行器等。同时,需要遵守三个基本原则,以确保原有功能的完整性和安全性。 知识点: * CAS支持客户端自定义登陆页面...
4. **服务管理**:在CAS中,每个需要认证的应用被称为“服务”。服务的配置通常在`cas-services.xml`或`application.yml`中。你可以定义服务的名称、ID、访问策略等,这将影响登录页面上显示的服务信息。 5. **主题...
2. **CAS配置**:修改登录页通常涉及修改CAS服务器的配置,可能需要在`cas-server-config.xml`等配置文件中调整视图相关的设置,以指向自定义的登录页面。 3. **Web应用程序开发**:你需要具备基本的Web开发技能,...
在CAS 3.5.2版本中,还包含了一些关键特性,例如支持多种认证机制(如LDAP、JDBC等),可扩展的服务注册,以及对不同协议(如CAS v1、v2、v3)的支持。对于开发者来说,可以通过修改配置文件(如`...
在实际操作中,可能还需要考虑其他因素,如语言本地化、自定义认证逻辑、以及如何处理失败的登录尝试等。同时,确保所有改动符合CAS的安全最佳实践,以防止潜在的安全风险。 总结,实现CAS系统下不同应用展示不同...
8. **异常处理和错误页面**:确保正确处理各种可能的CAS相关异常,如认证失败、票据无效等,并配置合适的错误页面以提供用户友好的反馈。 9. **测试和调试**:完成配置后,进行详尽的测试,确保登录、登出、票证...
在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与CAS服务器配合,实现单点登录功能。 首先,让我们理解一下CAS(Central Authentication Service)的核心概念。CAS是一个开放源码的SSO解决方案...
标题中的“自定义客户端登录CAS服务器-iframe实现”是指一种基于CAS(Central Authentication Service)的认证方式,它利用iframe在不离开当前页面的情况下实现用户的单点登录(Single Sign-On,SSO)。CAS是一种...
标题中的“让CAS支持客户端自定义登陆页面——客户端篇”表明了本文主要探讨的是如何在中央认证服务(Central Authentication Service, CAS)系统中,允许客户端应用程序实现自定义登录页面的配置与实现。CAS是一个...
- 接下来,在Spring MVC配置文件中添加remoteLoginController的bean定义,用于处理远程登录请求。 ```xml p:flowExecutor-ref="remoteLoginFlowExecutor" p:defaultFlowId="remoteLogin-webflow"> p:...
用的java语言后台连接CAS登陆验证的工具类 特点: 1、无需修改CAS服务端的代码 2、能够自动获取ticket等参数值 3、这是一个工具类调用非常方便,不光适用于java也适用于android, 其他语言也可以参考,注释写的非常...
3. 使用Shiro进行权限控制:在Shiro配置中,我们可以定义一个自定义的CasRealm,该realm使用Pac4J进行认证。这样,当用户尝试访问受保护的资源时,Shiro将通过Pac4J与CAS交互,获取ticket并验证用户身份。 4. 实现...
3. **集成CAS客户端库**:在外部系统中,需要集成CAS客户端库,如Java CAS Client、Spring Security CAS等,它们负责处理与CAS服务器的交互,包括重定向用户到CAS登录页面、接收和验证服务票证。 4. **配置客户端...
在整个过程中,为了保证安全性,CAS通常采用SSL/TLS协议来加密传输ST和TGC等敏感信息。 #### 三、CAS 服务端配置 接下来详细介绍CAS服务端的配置步骤: ##### 1. 准备环境 - **JDK**:推荐使用JDK 1.6 或更高...
这些测试用例通常会模拟CAS服务器的响应,确保客户端代码能够正确处理各种情况,如正常登录、票证验证失败、未授权等。 总结起来,这个"cas单点登陆带attribute客户端示例程序"是学习和实现CAS SSO的一个宝贵资源。...
改造cas,实现自定义登录页面,及错误跳转。具体参考我的博客 http://blog.csdn.net/just_lion/article/details/17204979
- 在pom.xml中添加CAS客户端的依赖,如`cas-client-support-springboot`等。 - 配置`application.properties`或`application.yml`,包含CAS服务器的URL、服务验证URL等相关参数。 3. **编写认证逻辑**: - 创建...
CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...