您的位置:首页 > 其它

CAS自定义登录验证

2016-03-04 14:45 363 查看
上一篇文章介绍了CAS单点登录客户端获取服务端登录页面表单信息的配置,本篇文章简单介绍一下自定义登录验证的操作,基于上一篇文章http://blog.csdn.net/u011012826/article/details/50800577的基础上做的单点登录自定义验证方法,废话不多说,以下为具体的配置信息:

cas单点登录的登录验证信息,配置在/src/main/webapp/WEB-INF/deployerConfigContext.xml中的authenticationHandlers配置,authenticationHandlers list主要是用来做认证用的。该list中所有的bean都需要实现AuthenticationHandler接口中的authenticate方法。用户提交认证请求之后,要满足该list中任意认证的条件才算是认证成功。每一个bean都可以配置自己的验证方式。所以,对于有多个认证方式的应用的时候,在这里自行组装认证条件就可以。具体的操作如下:

1、创建自己的NbrcAuthenticationHandler.java类实现AuthenticationHandler,如下:其中的NbrcCredentials类在上一篇文章中有做介绍,这里不做多余的介绍。

import javax.sql.DataSource;

import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.handler.AuthenticationHandler;
import org.jasig.cas.authentication.handler.NoOpPrincipalNameTransformer;
import org.jasig.cas.authentication.handler.PasswordEncoder;
import org.jasig.cas.authentication.handler.PlainTextPasswordEncoder;
import org.jasig.cas.authentication.handler.PrincipalNameTransformer;
import org.jasig.cas.authentication.principal.Credentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;

public class NbrcAuthenticationHandler implements AuthenticationHandler {
private static final Class<NbrcCredentials> DEFAULT_CLASS = NbrcCredentials.class;

private PasswordEncoder passwordEncoder = new PlainTextPasswordEncoder();
private JdbcTemplate jdbcTemplate;
private DataSource dataSource;

private PrincipalNameTransformer principalNameTransformer = new NoOpPrincipalNameTransformer();
private Class<?> classToSupport = DEFAULT_CLASS;
private boolean supportSubClasses = true;
@Override
public boolean authenticate(Credentials credentials) throws AuthenticationException {
final NbrcCredentials nc = (NbrcCredentials) credentials;
final String username = getPrincipalNameTransformer().transform(nc.getUsername());
final String password = nc.getPassword();
try {
String sql = "SELECT pwd FROM user WHERE user_name = ? ";
String dbPassword = getJdbcTemplate().queryForObject(
sql
, String.class, username);
return dbPassword.equals(password);
} catch (final IncorrectResultSizeDataAccessException e) {
// this means the username was not found.
return false;
}
}

@Override
public boolean supports(Credentials credentials) {
return credentials != null
&& (this.classToSupport.equals(credentials.getClass()) || (this.classToSupport
.isAssignableFrom(credentials.getClass()))
&& this.supportSubClasses);
}

public PasswordEncoder getPasswordEncoder() {
return passwordEncoder;
}

public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}

public PrincipalNameTransformer getPrincipalNameTransformer() {
return principalNameTransformer;
}

public void setPrincipalNameTransformer(PrincipalNameTransformer principalNameTransformer) {
this.principalNameTransformer = principalNameTransformer;
}

public final void setDataSource(final DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.dataSource = dataSource;
}

protected final JdbcTemplate getJdbcTemplate() {
return this.jdbcTemplate;
}

protected final DataSource getDataSource() {
return this.dataSource;
}
}


2、将原有系统自带的验证方法替换为自己定义的验证方法:/src/main/webapp/WEB-INF/deployerConfigContext.xml中的authenticationHandlers配置

修改前:

<property name="authenticationHandlers">

<list>

<bean

class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"

p:httpClient-ref="httpClient" p:requireSecure="false" />

<!-- 用户密码认证配置 -->

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

<property name="dataSource" ref="dataSource"></property>

<property name="sql" value="SELECT pwd FROM user WHERE user_name = ? "></property>

<!-- <property name="passwordEncoder" ref="MD5PasswordEncoder"></property> 用户密码加密认证,需要时开启-->

</bean>

</list>

</property>

修改后:

<property name="authenticationHandlers">

<list>

<bean

class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"

p:httpClient-ref="httpClient" p:requireSecure="false" />

<!-- 用户密码认证配置 -->

<bean class="com.casServer.NbrcAuthenticationHandler" >

<property name="dataSource" ref="dataSource"></property>

</bean>

</list>

</property>

这样,当登录提交的时候,就会进入到NbrcAuthenticationHandler中进行验证,从而实现自定义登录的功能,在NbrcAuthenticationHandler中可以自定义自己的验证方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: