论坛首页 Java企业应用论坛

扩展cas验证系统自己又一些小小的疑问请教大家!

浏览 5535 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-07  
最近研究了一下cas,准备把里面的login 验证修改成自己的数据库验证.

网上找了一些资料,但是还有一些不明白的地方

扩展这个验证应该修改的是客户端的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 不知道如何实现的?
那个有用过这个 出来请教一下
谢谢
   发表时间:2007-06-08  
里面的chechk实现了对用户的验证 但是传进来的那个UsernamePasswordCredentials 这个参数
  String username = credentials.getUsername(); 
  String password = credentials.getPassword(); 
credentials好像没有被赋值 怎么直接取?
0 请登录后投票
   发表时间:2007-06-18  
问题解决


.
0 请登录后投票
   发表时间: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提供了所有的认证处理方式
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics