浏览 5535 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-07
网上找了一些资料,但是还有一些不明白的地方 扩展这个验证应该修改的是客户端的web.xml配置文件里面的 <context-param> <param-name>edu.yale.its.tp.cas.authHandler</param-name> <param-value>edu.yale.its.tp.cas.auth.provider.SampleHandler</param-value> </context-param> 把这个authHandler扩展成自己的实现就可以了 后来我找到了 服务器端的web.xml文件里面加载deployerConfigContext.xml文件,然后在里面配置自己的数据源 <property name="authenticationHandlers"> <list> <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" /> <bean class="edy.com.xxx.cas.authenticationHandlers.DBHandlers" /> </list> </property> 然后编写一个DBHandlers继承AbstractUsernamePasswordAuthenticationHandler类来实现扩展 import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import org.apache.log4j.Logger; import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler; import org.jasig.cas.authentication.principal.UsernamePasswordCredentials; import cn.com.tiansky.tool.MD5; /** * 支援CAS3,。实现自己的Handler(未自定义credentials,如因业务需要而修改,则需要同时 * 修改LoginFormAction和定义自己的credentialsToPrincipalResolvers)\ * ,你的需求也许包括了需要通过检索数据库来比配credential中的username和password, * 也可能不是数据库,而是LDAP什么的,总之你得开始制作自己的handler了! * credential的种类是很多的,有的基于用户名和密码,有的基于http请求, * 如果你有你自己的credential的话,就得为它制作有一个handler, * 来告诉CAS如何处理这种特有的credential。 * @author tiansky * @version 1.0 * */ public final class DBHandlers extends AbstractUsernamePasswordAuthenticationHandler{ /** * Logger log:log4j日志 */ private Logger log=Logger.getLogger(AbstractUsernamePasswordAuthenticationHandler.class); /** * 相关的数据库配置DS对应的jndi */ private String _jndi="jdbc/EmployeeDB"; /* (non-Javadoc) * @see org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler#authenticateUsernamePasswordInternal(org.jasig.cas.authentication.principal.UsernamePasswordCredentials) */ public boolean authenticateUsernamePasswordInternal( final UsernamePasswordCredentials credentials) { String username = credentials.getUsername(); String password = credentials.getPassword(); log.info("username:"+username); log.info("password:"+password); try { password = MD5.encrypt(password); log.debug("md5password" + password); } catch (Exception e) { log.warn("MD5加密出错", e); //throw new Exception("MD5加密出错"); return false; } /* if (StringUtils.hasText(username) && StringUtils.hasText(password) && username.equals(getPasswordEncoder().encode(password))) { getLog().debug( "User [" + username + "] was successfully authenticated."); return true; } */ try { if(checkuser(username,password)==1) { getLog().info("认证成功!"); return true; } } catch(Exception e) { getLog().error("User [" + username + "] failed authentication",e); } return false; } private int checkuser(String user, String pwd) throws Exception { int rei = 0; // Obtain our environment naming context log.debug("Obtain our environment naming context"); Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); // Look up our data source DataSource ds = (DataSource) envCtx.lookup(this._jndi); log.debug("获取ds成功!"); // Allocate and use a connection from the pool Connection conn = ds.getConnection(); log.debug("获取conn成功!"); // ... use this connection to access the database ... String sql = "select OPERATORID from operator where OPERATORLOGINNAME='" + user + "' and OPERATORPASSWORD='" + pwd + "' "; log.info("sql!= "+sql); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql); if (rs.next()) { //String oid = rs.getString("OPERATORID"); /* _op = new Operator(oid); _op.setName("操作员"); _op.setLoginname(user); _op.setPwd(pwd); */ rei = 1; } else { System.out.println("帐号不存在或密码错误!"); } conn.close(); return rei; } /* (non-Javadoc) * @see org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler#afterPropertiesSetInternal() */ protected void afterPropertiesSetInternal() throws Exception { super.afterPropertiesSetInternal(); getLog() .warn( this.getClass().getName() + " is only to be used in a production environment."); } } 这个类里面的 public boolean authenticateUsernamePasswordInternal( final UsernamePasswordCredentials credentials) 这个方法就是实现了对自己的用户验证名称 密码等,但是偶就是不知道UsernamePasswordCredentials 传进来的这个参数(就是一个存储username 跟password的javaBean)不知道在哪里赋值的,也就是具体数据库获取user对象赋值给credentials 不知道如何实现的? 那个有用过这个 出来请教一下 谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-08
里面的chechk实现了对用户的验证 但是传进来的那个UsernamePasswordCredentials 这个参数
String username = credentials.getUsername(); String password = credentials.getPassword(); credentials好像没有被赋值 怎么直接取? |
|
返回顶楼 | |
发表时间:2007-06-18
问题解决
了 . |
|
返回顶楼 | |
发表时间:2007-06-19
最近在看cas.你的问题cas3.0 和acegi都提供了
cas3.0提供一个authenticationHandler: org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler acegi 提供一个 authenticationHandler: org.acegisecurity.adapters.cas3.CasAuthenticationHandler cas3.0提供了所有的认证处理方式 |
|
返回顶楼 | |