学习软件Moodle需要开发成无记录模式,集成CAS模式,一个用户绑定一个moodle账号,为了解决这个问题,需要定制开发CAS登录认证模块。
第一种方法:
修改模块如下:
cas-server-3.5.1
包路径 org.jasig.cas.authentication.principal;
修改类UsernamePasswordCredentials.java
将
/**
* @param userName The userName to set.
*/
public final void setUsername(final String userName) {
this.username = userName;
}
注释掉,修改代码如下,在每次设置用户名的时候,随机从mdl_user里选取一个账号,达到无记录的模式,方便管理员对系统学习账号的控制管理。
public final void setUsername(final String userName) {
//此处可定义业务逻辑,随机选择moodle的学习账号
if(userName.equalsIgnoreCase("sxyy0102016"))
{
this.username = "fdadmin";
-- SELECT username FROM mdl_user ORDER BY RAND() LIMIT n;
--n:数据条数
}
else
{
this.username = userName;
}
}
修改完后将编译后的class置入cas-server-core-3.5.1.jar包中,重启服务生效。
无记录学习模式改造成功。
第二种方法:
修改模块如下:
cas-server-support-jdbc-3.5.1
包路径 org.jasig.cas.adaptors.jdbc;
修改类QueryDatabaseAuthenticationHandler.java
将以下代码注释掉
protected final boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials) throws AuthenticationException {
final String username = getPrincipalNameTransformer().transform(credentials.getUsername());
final String password = credentials.getPassword();
final String encryptedPassword = this.getPasswordEncoder().encode(
password);
try {
final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
UsernamePasswordCredentials userinfo = (UsernamePasswordCredentials)credentials;
return dbPassword.equals(encryptedPassword);
} catch (final IncorrectResultSizeDataAccessException e) {
// this means the username was not found.
return false;
}
}
修改为:
protected final boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials) throws AuthenticationException {
final String username = getPrincipalNameTransformer().transform(credentials.getUsername());
final String password = credentials.getPassword();
final String encryptedPassword = this.getPasswordEncoder().encode(
password);
// String mdl_sql = "SELECT username FROM mdl_user ORDER BY RAND() LIMIT 1";
String mdl_sql = "SELECT DISTINCT(username) FROM mdl_user a, mdl_course_display b WHERE a.id = b.`userid` ORDER BY RAND() LIMIT 1";
try {
final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
UsernamePasswordCredentials userinfo = (UsernamePasswordCredentials)credentials;
if(dbPassword.equals(encryptedPassword) == true)
{
String mdl_userName = getJdbcTemplate().queryForObject(mdl_sql, String.class);
// credentials.setUsername("fdadmin");
System.out.println("mdl_userName="+mdl_userName);
credentials.setUsername(mdl_userName);
}
return dbPassword.equals(encryptedPassword);
} catch (final IncorrectResultSizeDataAccessException e) {
// this means the username was not found.
return false;
}
}
修改完后将编译后的class置入cas-server-core-3.5.1.jar包中,重启服务生效。
无记录学习模式改造成功。