技术分享 CAS单点登录 服务端配置 查看内容

cas 入门之三十一:cas 认证处理器-JAAS配置示例

老高 | 发布于 2017-05-05 14:51| 浏览()| 评论() | 收藏() | 点赞() | 打印

摘要: 关于cas 的JAAS认证,有之前写过一篇文章(cas 入门之九:cas 认证处理器-JAAS),但是那篇文章没有详细的描述其中的配置情况,况且也有错误,在此对大家表示歉意。我将以前作的JAAS 示例整理成本文,也算是对前一篇的补充与错误订正。同时供有需要的同学参考。

关于cas 的JAAS认证,有之前写过一篇文章(cas 入门之九:cas 认证处理器-JAAS),但是那篇文章没有详细的描述其中的配置情况,况且也有错误,在此对大家表示歉意。我将以前作的JAAS 示例整理成本文,也算是对前一篇的补充与错误订正。同时供有需要的同学参考。

对于cas的jaas的认证,按以下步骤操作(因为我对其他web服务器不太熟悉,所以仍以tomcat配置为例,系统环境是windows7):

1.将原版的cas 以http形式发布至tomcat,并测试是否成功。此时cas 只有一个认证处理器,即简单认证处理器,只要用户名/密码相等就认证通过。

(我相信这一步大家能够成功,以http形式发布cas可参见  cas 入门之三:cas 之http 部署(CAS取消https方法配置) ,这样我们可以省略自己制作证书的过程);

2.构建如下类内容:

package com.test.jaas;
import java.security.Principal;
public final class SamplePrincipal implements Principal {
  private String name;
  public SamplePrincipal(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
  public boolean equals(Object o) {
    return (o instanceof SamplePrincipal)
        && this.name.equalsIgnoreCase(((SamplePrincipal) o).name);
  }
  public int hashCode() {
    return name.toUpperCase().hashCode();
  }
}

package com.test.jaas;
import java.io.IOException;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
public class SampleLoginModule implements LoginModule {
  private boolean isAuthenticated = false;
  private CallbackHandler callbackHandler;
  private Subject subject;
  private SamplePrincipal principal;
  public void initialize(Subject subject, CallbackHandler callbackHandler,
      Map sharedState, Map options) {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
  }
  public boolean login() throws LoginException {
    try {
      NameCallback nameCallback = new NameCallback("username");
      PasswordCallback passwordCallback = new PasswordCallback("password",
          false);
      final Callback[] calls = new Callback[] { nameCallback, passwordCallback };
    // 获取用户数据
      callbackHandler.handle(calls);
      String username = nameCallback.getName();
      String password = String.valueOf(passwordCallback.getPassword());
      if ("12345".equals(password)) {// 验证通过
        principal = new SamplePrincipal(username);
        isAuthenticated = true;
      } else {
        throw new LoginException("user or password is wrong");
      }
    } catch (IOException e) {
      throw new LoginException("no such user");
    } catch (UnsupportedCallbackException e) {
      throw new LoginException("login failure");
    }
    return isAuthenticated;
  }
  /**
   * 验证后的处理,在Subject中加入用户对象
   */
  public boolean commit() throws LoginException {
    if (isAuthenticated) {
      subject.getPrincipals().add(principal);
    } else {
      throw new LoginException("Authentication failure");
    }
    return isAuthenticated;
  }
  public boolean abort() throws LoginException {
    return false;
  }
  public boolean logout() throws LoginException {
    subject.getPrincipals().remove(principal);
    principal = null;
    return true;
  }
}

这两个类来自http://www.blogjava.net/fastunit/archive/2008/01/28/178204.html,对于第二个类进行修改,即对于密码是12345,就认证通过(为了省空间,我把代码排的比较密)。将这两个类打成jar包放在cas\WEB-INF\lib中,或者将相应的class放在cas\WEB-INF\classes中(当然需要相应的包路径);

3.将 <bean class="org.jasig.cas.authentication.handler.support.JaasAuthenticationHandler"/>

填加到delopyerConfigContext.xml中。这样给cas 增加一个认证处理器,即当密码是12345的时候认证通过,为了让它能够起作用,进行如下配置

4.新建文件jaas.conf内容

CAS{
  com.test.jaas.SampleLoginModule required debug=false;
};

保存将其存放在 user.home对应的目录下(在此给大家道歉,我前一篇文章,对于这个文件结尾少了一个英文式分号(;)),

关于user.home的值,可以写一个测试类测试一下:

package com.test.jaas;
public class Test {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.home"));
    }
}

5.修改JAVA_HOME变量使其指向jre安装目录(我的JAVA_HOME=C:\Program Files\Java\jdk1.6.0_43改成JAVA_HOME=C:\Program Files\Java\jre6),

而不是jdk安装目录,因为我们开发人员都喜欢用jdk目录。

6.修改${jre_home}/lib/security/java.security 文件,大约在87行增加如下内容,并保存

login.config.url.1=file:${user.home}/jaas.conf

至此配置全部完毕,启动tomcat访问cas 并输入用户名test密码12345,测试一下是否成功,祝大家好运。

发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情