`
iamlotus
  • 浏览: 106768 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在中Tomcat实现JAAS

阅读更多
这两天学习了一下JAAS,并遇到了一个Tomcat的bug,这里记录下来。



http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.html


这是sun的JAAS developer guide。



开始学习JAAS对于几个概念很混淆,我的习惯是先理大框架,如果大概念不清晰不轻易往下看。找来找去,在callan的博客找到一篇http://callan.iteye.com/blog/158392
,这里的几个例子举得非常贴切


引用
理解这些类和接口的关系我给个生动的比方:一个军事学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同(Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的(Principal)的级别可以使用和访问学校不同资源。



一个(Subject)的(Principal)如果是士官级,那么可以访问的资源就相对少些,如果是将军级那就多些。当然一个(Subject)可以拥有多个(Principal)。



通过分析我们会发现,JAAS采用的也是身份检查+权限分配模式。因此JAAS的应用也分成两个部分:(1)认证;(2)授权。过程是先认证后根据身份来授权(有歧视的嫌疑的东东,本人可是反歧视人士)。

-----------------------------赞叹的分割线--------------------------------------
由于最近在玩tomcat,所以作了几个实验都是基于tomcat的。http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html给出了几个例子,我试了JDBCRealm和MemoryRealm都没问题。但在试org.apache.catalina.realm.JAASRealm时遇到了问题,tomcat总是报
引用
2009-11-11 13:40:10 org.apache.catalina.realm.JAASRealm parseClassNames
严重: Class tt.User not found! Class not added.
2009-11-11 13:40:10 org.apache.catalina.realm.JAASRealm parseClassNames
严重: Class tt.Role not found! Class not added.

这里 User和Role是extends Principal的POJO.页面也会登录不成功转到403 error
查了一下发现这是tomcat的一个bug https://issues.apache.org/bugzilla/show_bug.cgi?id=44084。 根本原因是以前启动tomcat时JAASReaml不去验证UserClassName和RoleClassName,于是一哥们就报了个bughttps://issues.apache.org/bugzilla/show_bug.cgi?id=40150。修40150的哥们去Class.forName了一把就把状态fix了,结果他没注意所用的ClassLoader(估计UT时用的是Tomcat/lib里面的类),然后Jetspeed的开发者就发现他们的自定义Principal找不到了。
以上不是重点,重点是https://sec1.woopra.com/docs/changelog.html说这个bug在6.0.16中就真正fix了。但我看了一下我的tomcat正是6.0.16啊!又去下了个6.0.20还是有这个问题。
我的解决是,在eclipse的server配置中open luanch configuration->Classpath->User Entries中单独加入这两个类。试了试好了。
没时间去看tomcat这块代码,感觉上这是个没修好的bug?
-----------------------------郁闷的分割线--------------------------------------
几点感想
1) Subject,Principal这两个名字起的超烂
2)LoginModule.login先构造一个Callback(UserNameCallback,PasswordCallback)数组,再由CallbackHandler.handle()去负责获取具体的UserName,Password。看看这里的代码

 for (Callback cb : cbs) {
            if (cb instanceof NameCallback) {
                NameCallback nc = (NameCallback) cb;
                nc.setName(userName);
            }
            if (cb instanceof PasswordCallback) {
                PasswordCallback pc = (PasswordCallback) cb;
                pc.setPassword(password.toCharArray());
            }
        }

强转啊强转,bad smell啊bad smell
另外这里感觉像template method更多些。既然CallbackHandler用到强转,说明它已经和LoginModule绑在一起了,既然不能decouple,干脆把Callback去掉,写成这样
class LoginModule{
    abstract void readLoginInfo();
}

当然...这样似乎不好重用,而且显得不是很酷。不过到底有多少人会用到DNA验证呢?就算用到多写两句也不会死人吧。这样换来和直觉相一致的设计是否值得?
-----------------------------完结的分割线--------------------------------------
我没有自己去写JAAS Realm,看架势Sun的设计是一个subject能带着不同类型的principal,而org.apache.catalina.realm.JAASRealm只有一个Role,如果我希望有多种维度的权限(比如User同时属于不同的Company和Location)怎么办?自己实现一个JAASRealm吗?
2
1
分享到:
评论
1 楼 marshan 2013-09-12  
文章总结的不错。Class xxx not found! Class not added的问题是因为realm定义的位置不对。应该放到context里。

相关推荐

    tomcat_jaas_demo

    tomcat下jaas配置实例(文档有不完善的地方) 1、需要修改 bin\startup.bat(根据自己的环境修改) SET JAVA_HOME=C:\programs\Java\jdk1.8.0_211 SET TOMCAT_HOME=C:\programs\apache-tomcat-5.5.20 2、需要修改 bin...

    JAAS认证(mac版tomcat)

    文件中包含 已配置好的tomcat7和jass示例 打包部署后即可运行 还有一份说明文档 tomcat配置的是mac版的,如果是windows的系统请自行修改tomcat启动参数

    jaas规范实现代码

    jaas实现,单纯java文件

    JAAS灵活的Java安全机制

    AAS灵活的Java安全机制

    jaas.jar jaas.jar

    jaas.jar jaas.jar jaas.jar

    jaas详细配置精讲

    jaas详细配置精讲 tomcat web.xml

    利用JAAS实现简单的页面验证与授权

    Java 2 SDK 1.3引入了JAAS( Java Authentication and Authorization Service),增加了基于用户的访问控制能力,即根据谁在运行代码来进行授权。JAAS已经整合进了Java 2 SDK 1.4,作为标准的用户认证与授权模型。

    jaas j2se例子

    jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas j2se例子jaas ...

    JAAS简介及实例.

    JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.JAAS简介及实例.

    Java JAAS安全认证 demo

    JAAS JaasDemo JAAS例子

    java JAAS登陆验证

    java JAAS登陆验证

    swbLogin:由SWBDataManager支持的Tomcat JAAS登录模块

    创建JAAS配置文件该配置必须包含模块的必要参数: SWBLoginModule { org.semanticwb.auth.SWBDMLoginModule required debug=true roles="Admin,User,Device" number="1357"; }; 告诉Tomcat文件位于何处: ...

    JAAS Demo

    JAAS简单入门例子

    JAAS认证与授权教程

    JAAS认证与授权教程,包含本教程的源代码

    java软件包文件 jaas.jar

    JAAS 本身包括文档和一个lib 目录,其中只有一个jar 文件(jaas.jar)。

    在JAAS基础上的Java安全编程

    JAAS(Java Authentication and Authentication Service Jay,认证和授权服务)是Java安全编程的一个重要补 充。它提供了根据验证主题身份来验证主题和授权资源访问的标准方法。本文较全面地介绍了JAAS的特点、组成 ...

    基于JAAS的Java安全编程

    JAAS是对原有Java 2安全框架的一个重要补充。本文较全面地介绍了JAAS的特点、组成及其在Jay。安全编程中的应 用。并简单分析了一个例子,该例经扩充后可直接应用于实践

    JAAS简介及示例代码

    Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序

Global site tag (gtag.js) - Google Analytics