壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1293|回复: 0

JAAS是什么?

[复制链接]
发表于 2010/5/17 11:18:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x

Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中,而不改变应用程序级的代码。
核心JAAS类
JAAS的核心类和接口可以被分为三种类型,大多数都在javax.security.auth包中,还有一些接口的实现类在com.sun.security.auth包中。
普通类 Subject,Principal,Credential(凭证)
Subject类代表了一个验证实体,它可以是用户、管理员、Web服务,设备或者其他的过程。该类包含了三中类型的安全信息:
1)  身份(Identities):由一个或多个Principal对象表示
2)  公共凭证(Public credentials):例如名称或公共密钥
3)  私有凭证(Private credentials):例如口令或私有密钥
Principal对象代表了Subject对象的身份。它们实现了java.security.Principal和java.io.Serializable接口。在Principal类中,最重要的方法是getName()。该方法返回一个身份名称。在Subject对象中包含了多个Principal对象,因此它可以拥有多个名称。例如:登录名称、身份证号和Email地址都可以作为用户的身份标识。
Credential凭证并不是一个特定的类或借口,它可以是任何对象。凭证中可以包含任何特定安全系统需要的验证信息,例如标签(ticket),密钥或口令。Subject对象中维护着一组特定的私有和公有的凭证,这些凭证可以通过Subject 方法getPrivateCredentials()和getPublicCredentials()获得。这些方法通常在应用程序层中的安全子系统被调用。
JAAS验证原理
     验证 LoginContext,LoginModule,CallBackHandler,Callback
验证:LoginContext
  在应用程序层中,可以使用LoginContext对象来验证Subject对象。LoginContext对象同时体现了JAAS的动态可插入性(Dynamic Pluggability),因为当创建一个LoginContext的实例时,需要指定一个配置。LoginContext通常从一个文本文件中加载配置信息,这些配置信息告诉LoginContext对象在登录时使用哪一个LoginModule对象。
  下面列出了在LoginContext中经常使用的三个方法:
     login () 进行登录操作。该方法激活了配置中制定的所有LoginModule对象。如果成功,它将创建一个经过了验证的Subject对象;否则抛出LoginException异常。
     getSubject () 返回经过验证的Subject对象
     logout () 注销Subject对象,删除与之相关的Principal对象和凭证
验证:LoginModule
  LoginModule是调用特定验证机制的接口。包含了下面几种LoginModule的实现类:
       JndiLoginModule 用于验证在JNDI中配置的目录服务
       Krb5LoginModule 使用Kerberos协议进行验证
       NTLoginModul 使用当前用户在NT中的用户信息进行验证
       UnixLoginModule 使用当前用户在Unix中的用户信息进行验证
  同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中。
   LoginModule接口中包含了五个方法:
1)   initialize () 当创建一LoginModule实例时会被构造函数调用
2)   login () 进行验证,通常会按照登录条件生成若干个Principal对象
3)   commit () 进行Principal对象检验,按照预定义Principal条件检验Login生成的Principal对象,所有需要的条件均符合后,把若干个生成的Principal对象付给Subject对象,JAAS架构负责回传给LoginContext.
4)  abort () 当任何一个LoginModule对象验证失败时都会调用该方法。任何已经和Subject对象绑定的Principal对象都会被解除绑定。
5)  logout () 删除与Subject对象关联的Principal对象和凭证,消除Subject,Principal等认证对象。
验证:CallbackHandler和Callback
  CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那里收集必要的验证信息,同时独立于实际的收集信息时发生的交互过程。
   JAAS在javax.sevurity.auth.callback包中包含了七个Callback的实现类和两个CallbackHandler的实现类:ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只会在客户端使用到。
在应用程序中使用JAAS验证通常会涉及到以下几个步骤:
  1. 创建一个LoginContext的实例。
  2. 为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数
传送给LoginContext。
  3. 通过调用LoginContext的login()方法来进行验证。
  4. 通过使用login()方法返回的Subject对象实现一些特殊的功能(假设
登录成功)。
  下面是一个简单的例子:
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
  在运行这段代码时,后台进行了以下的工作。
  1. 当初始化时,LoginContext对象首先在JAAS配置文件中找到MyExample
项,然后更具该项的内容决定该加载哪个LoginModule对象。
  2. 在登录时,LoginContext对象调用每个LoginModule对象的login()方法。
  3. 每个login()方法进行验证操作或获得一个CallbackHandle对象。
  4. CallbackHandle对象通过使用一个或多个CallBack方法同用户进行交互,获得用户输入。
  5. 向一个新的Subject对象中填入验证信息。
授权 Policy,AuthPermission,PrivateCredentialPermission
与权限管理、用户认证的主要类包为:
com.liferay.portal.security.auth.*
com.liferay.portal.service.permission
com.liferay.portal.struts.PortalRequestProcessor
Liferay关于JAAS的实现包都在com.liferay.portal.security.auth.*下,在$catalina_home/conf/jaas.conf中定义了Liferay实现的loginModule,在我使用的版本中,PortalLoginModule将首先通过对象池取出一个自定义Liferay用户自定义的实现,即也可以在portal中再次自定义loginModule。显然,如果没有自定义的实现,将根据用户所使用的服务器自动进行选择默认实现。
Liferay自身所实现的user Principals和role Principals也仅仅是保存了用户的userid,以其作为自身标识,在登陆成功时赋予了所有用户“users”角色:
PortalRole role = new PortalRole("users");
getSubject().getPrincipals().add(role);
Liferay的PortalRequestProcessor扩展了TilesRequestProcessor,实现了自定义的请求处理流程。在请求流程中复写了processRoles(),在这个函数中进行了用户权限的判断,从而达到了对web资源的保护。
Permission是Liferay定义的用户访问的权限判断,由processRoles调用进行访问控制。
值得一提的是,Liferay本身也含有登录模块,这个登录模块所做的主要工作为通过认证确定用户的登录信息正确,并通过用户的登录信息取得用户userid存放在session中,为JAAS的登陆模块提供基础(即通过登陆的正确用户id与密码)。登录的用户默认为LDAP登陆,但是为默认禁用,所以用户认证Liferay都通过一个数据库的认证实现在loginAction中进行的用户判断,取出了userid和password存放在session中。
整个过程如下:
如上图所示,触发JAAS的登录模块的是在登录成功后转向了/c/portal/protected,而此路径为tomcat的安全域,所以tomcat将调用用户自定义的登录模块进行用户认证,通过认证后通过对用户角色的对比,来判断用户是否允许访问。
图2 Liferay认证流程

用户登录
登录成功,保存用户信息
JAASLoginModule
  





副录:帮助进行相关类查看
SecureFilter->进行访问地址限制和是使用安全连接转换。
PropsUtil—〉portal-ejb.jar里的portal.property
MainServlet 扩展Struts的action Serverlet,进行映射。

liferay-portal-4.1.2的权限管理主要有2部分构成:
1.user的部门归属
2.对单个portlet的授权
超级用户登陆系统后,将进入超级用户的管理界面,管理界面总共有Guest、Private、CMS、Support 四层组成,即在Myplace中的4种视图, 现对其进行介绍.
Guest视图:主要管理普通用户的所访问的主页内容,在此视图中可以管理展现在主页上的各个portlet,管理portlet中展现的内容以及portlet的展现形式以及方位。Portlet的内容管理放在稍后的视图中详细讲解,portlet的方位以及显示形式后可以通过页面上直接的拖放进行设置。
默认情况下,我们所列的portlet就是匿名用户所看到的门户,在每个portlet的设置中,我们还看到了权限的设置,可以将这个portlet的配置,查看等权限(每个portlet的权限不相同,每个都有配置、查看权限,但是有个复杂的portlet如用户管理的就有更多的如添加用户、删除用户等权限)授予用户,这里权限的授予分6级,直接授予用户,授予组织、授予地点、授予用户群、授予社群和授予客人(用户群和社群是自定义的)。Liferay的用户机制为公司—地点—组织—个人,所以授予某一高级的组,下挂的用户将都会自动获得权限。在我的应用中,我将WIKI加入了门户首页,同时将察看与删除授予匿名用户,所以,首页就拥有了一个大家参与修改的区域WIKI了!
Private 视图:这个是超级用户的私人界面,这里特别分析了几个简单portlet的权限管理的实现。
HelloWorldPortlet。位置Test->helloworld 这个portlet是最简单的一个展示,而且仅仅只有view的功能,所以这个权限管理就是能否在用户的视图中显示就行了,代码中的权限代码无,只是由layout调用HelloWorldPortlet。注:这里是通过设置直接调用HelloWorldPortlet,没有经过Struts框架,所以代码直接继承GenericPortlet,不能由路径访问。
Announcements。位置,这个portlet中访问路径由struts配置文件指定,这个portlet代码ViewAction继承PortletAction,PortletAction继承的是Struts Action.在portlet.xml中,
<name>view-action</name>
<value>/wiki/view</value>
指定了这个portlet的view所调用的路径,portal容器会根据struts的配置调用指定的Action。在进行action调用时,很显然通过了Liferay扩展的PortalRequestProcessor(上一篇提到),也就进行了权限检查。配置Announcements的路径在liferay-portlet.xml中配置,为/announcements/edit_configuration,同样这也是一个struts路径,她的权限管理也同view一样,在PortalRequestProcessor中完成。
IFramePortlet。这个portlet也是一个简单标签的使用例子。在这个portlet中,与HelloWorldPortlet相同,也没有Struts的路径配置,而是直接在portlet.xml中定义了接受请求的Action,所继承的StrutsPortlet由于不是由struts Action而是GenericPortlet扩展而来,所以在访问的时候没有通过PortalRequestProcessor,所以其内部明确调用了liferay的权限管理代码:
PermissionChecker checker = PermissionThreadLocal.getPermissionChecker();
由上面我们所分析的几个简单的portlet来看,以后在进行portlet开发时有2种选择,当逻辑比较少时,我们可以象IFramePortlet一样,通过对StrutsPortlet的继承完成。当业务逻辑比较复杂时(多个路径),采用Struts进行路径配置时,最好同Announcements一样,通过继承PortletAction来将自身开发的portlet纳入liferay的权限管理框架中。
CMS视图:明显,这个层进行文档管理,用过Guest视图就可以知道门户的所有的新闻文章都在journal中进行管理,对它的使用网上有很多很有用的文章,多用几次也就熟悉了,强大的文本、图像编辑功能可以就近使用而不再用自己编码,肯定也是很愉快的了:)
Support视图:这个视图也是其他用户(非管理员用户)登陆后的定制页面,由管理员进行定制,主要操作和上面一致

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 09:31 , Processed in 0.011567 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表