`
iamlotus
  • 浏览: 107901 次
  • 性别: 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)

    **Java Authentication and Authorization Service (JAAS) 认证在Mac版Tomcat中的应用** Java Authentication and Authorization Service (JAAS) 是Java平台的核心组件,用于提供安全的用户认证和权限管理。在Mac版...

    JAAS灵活的Java安全机制

    Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现用户认证和权限授权的一个核心组件。它为开发者提供了一种灵活的方式来实现安全控制,确保只有经过验证和授权的用户能够访问敏感资源或...

    jaas规范实现代码

    在本文中,我们将深入探讨 JAAS 的核心概念、工作原理以及如何通过代码实现来理解这个规范。 首先,让我们了解一下 JAAS 的基本概念: 1. **身份验证(Authentication)**:这是确定用户身份的过程,通常通过...

    jaas详细配置精讲

    综上所述,JAAS在Tomcat中的配置涉及到多个文件和组件,包括自定义LoginModule、JAAS配置文件、Tomcat的`server.xml`和`tomcat-users.xml`,以及Web应用的`web.xml`。理解并熟练掌握这些配置,对于构建安全的J2EE...

    java JAAS登陆验证

    在Java Web应用中,如Tomcat、Jetty等,JAAS可以与Servlet容器进行集成,实现Web应用的安全管理。容器通常有自己的安全配置,但可以通过配置使其与JAAS交互,从而利用JAAS的认证和授权能力。 **总结** Java JAAS为...

    JAAS简介及示例代码

    下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...

    JAAS简介及实例

    Java Authentication and Authorization Service (JAAS) 是Java平台提供的一种安全框架,用于实现用户身份验证和权限管理。这个框架使得开发者可以轻松地在Java应用程序中集成安全性,而不必深入理解底层的复杂安全...

    tomcat5/tomcat5.5安装包

    【标题】"Tomcat5/tomcat5.5安装包" 涵盖了两个不同版本的Apache Tomcat服务器,即Tomcat 5.0和Tomcat 5.5。Tomcat是一个开源的、免费的应用服务器,主要用于部署和运行Java Servlets和JavaServer Pages(JSP)。它...

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

    ### 利用JAAS实现简单的页面验证与授权 #### JAAS简介 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一种安全框架,它主要用于实现应用级别的身份验证和授权服务。JAAS 的出现是对 ...

    JAAS in Web Applications

    - **Servlet容器支持**:大多数现代Servlet容器如Tomcat、Jetty都内置了对JAAS的支持,可以通过容器配置进行集成。 - **Web.xml配置**:在Web应用的部署描述符中,可以配置安全管理器,指定使用哪个JAAS Realm进行...

    Tomcat7.0 tomcat最新版本

    4. **增强的安全性**:Tomcat 7.0加强了安全特性,提供了更强的身份验证和授权机制,如集成Spring Security和JAAS,以及对SSL/TLS的改进支持,帮助保护Web应用程序免受攻击。 5. **更好的管理工具**:Tomcat 7.0...

    JAAS认证与授权教程

    Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,使得应用程序能够实现用户身份验证和权限管理。在这个教程中,我们将深入探讨JAAS的核心概念、工作...

    Tomcat 接口文档 API

    10. **Security**: Tomcat提供了丰富的安全功能,如角色基的安全约束、SSL/TLS支持、JAAS集成等。开发者可以使用Realm组件进行身份验证,定义AccessControlList来控制访问权限。 在学习Tomcat API时,阅读官方文档...

    tomcat7源码下载

    它支持JAAS(Java Authentication and Authorization Service),可以根据需要配置不同的 Realm 来实现用户认证。 六、Tomcat7性能优化 优化Tomcat7涉及多个方面,包括调整JVM参数、减少上下文重启、优化连接器...

    jaas.jar jaas.jar

    jaas.jar jaas.jar jaas.jar

    tomcat8.0源码

    - Tomcat支持JAAS(Java Authentication and Authorization Service),提供了用户认证和权限控制的功能。 - SSL/TLS支持允许安全的HTTPS连接,通过`server.xml`中的`<Connector>`元素配置。 6. **性能优化** - ...

    apache-tomcat-7.0.108.zip

    Apache Tomcat 7.0.108 是一个开源的Java Servlet容器,它实现了Java EE Web应用程序的标准,包括Servlet、JSP(JavaServer Pages)和Java EL(Java Expression Language)。这款软件是Apache软件基金会下的一个项目...

Global site tag (gtag.js) - Google Analytics