关于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,测试一下是否成功,祝大家好运。
发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)