这两天学习了一下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,于是一哥们就报了个bug
https://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吗?
分享到:
相关推荐
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...
**Java Authentication and Authorization Service (JAAS) 认证在Mac版Tomcat中的应用** Java Authentication and Authorization Service (JAAS) 是Java平台的核心组件,用于提供安全的用户认证和权限管理。在Mac版...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于实现用户认证和权限授权的一个核心组件。它为开发者提供了一种灵活的方式来实现安全控制,确保只有经过验证和授权的用户能够访问敏感资源或...
在本文中,我们将深入探讨 JAAS 的核心概念、工作原理以及如何通过代码实现来理解这个规范。 首先,让我们了解一下 JAAS 的基本概念: 1. **身份验证(Authentication)**:这是确定用户身份的过程,通常通过...
综上所述,JAAS在Tomcat中的配置涉及到多个文件和组件,包括自定义LoginModule、JAAS配置文件、Tomcat的`server.xml`和`tomcat-users.xml`,以及Web应用的`web.xml`。理解并熟练掌握这些配置,对于构建安全的J2EE...
在Java Web应用中,如Tomcat、Jetty等,JAAS可以与Servlet容器进行集成,实现Web应用的安全管理。容器通常有自己的安全配置,但可以通过配置使其与JAAS交互,从而利用JAAS的认证和授权能力。 **总结** Java JAAS为...
下面将详细介绍JAAS的工作原理、主要组成部分以及如何通过示例代码实现它。 JAAS的设计是模块化的,这意味着它能够适应各种不同的认证机制,如密码、数字证书等。其工作流程通常包括以下几个步骤: 1. **配置**:...
Java Authentication and Authorization Service (JAAS) 是Java平台提供的一种安全框架,用于实现用户身份验证和权限管理。这个框架使得开发者可以轻松地在Java应用程序中集成安全性,而不必深入理解底层的复杂安全...
【标题】"Tomcat5/tomcat5.5安装包" 涵盖了两个不同版本的Apache Tomcat服务器,即Tomcat 5.0和Tomcat 5.5。Tomcat是一个开源的、免费的应用服务器,主要用于部署和运行Java Servlets和JavaServer Pages(JSP)。它...
### 利用JAAS实现简单的页面验证与授权 #### JAAS简介 Java Authentication and Authorization Service (JAAS) 是 Java 平台提供的一种安全框架,它主要用于实现应用级别的身份验证和授权服务。JAAS 的出现是对 ...
- **Servlet容器支持**:大多数现代Servlet容器如Tomcat、Jetty都内置了对JAAS的支持,可以通过容器配置进行集成。 - **Web.xml配置**:在Web应用的部署描述符中,可以配置安全管理器,指定使用哪个JAAS Realm进行...
4. **增强的安全性**:Tomcat 7.0加强了安全特性,提供了更强的身份验证和授权机制,如集成Spring Security和JAAS,以及对SSL/TLS的改进支持,帮助保护Web应用程序免受攻击。 5. **更好的管理工具**:Tomcat 7.0...
Java Authentication and Authorization Service (JAAS) 是Java平台中用于安全性的关键组件,它提供了一种框架,使得应用程序能够实现用户身份验证和权限管理。在这个教程中,我们将深入探讨JAAS的核心概念、工作...
10. **Security**: Tomcat提供了丰富的安全功能,如角色基的安全约束、SSL/TLS支持、JAAS集成等。开发者可以使用Realm组件进行身份验证,定义AccessControlList来控制访问权限。 在学习Tomcat API时,阅读官方文档...
它支持JAAS(Java Authentication and Authorization Service),可以根据需要配置不同的 Realm 来实现用户认证。 六、Tomcat7性能优化 优化Tomcat7涉及多个方面,包括调整JVM参数、减少上下文重启、优化连接器...
jaas.jar jaas.jar jaas.jar
- Tomcat支持JAAS(Java Authentication and Authorization Service),提供了用户认证和权限控制的功能。 - SSL/TLS支持允许安全的HTTPS连接,通过`server.xml`中的`<Connector>`元素配置。 6. **性能优化** - ...
Apache Tomcat 7.0.108 是一个开源的Java Servlet容器,它实现了Java EE Web应用程序的标准,包括Servlet、JSP(JavaServer Pages)和Java EL(Java Expression Language)。这款软件是Apache软件基金会下的一个项目...