??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成77777在线播放网站,亚洲精品人成电影网,亚洲短视频在线观看http://www.tkk7.com/hengheng123456789/category/17307.htmlzh-cnSun, 11 Mar 2007 04:52:46 GMTSun, 11 Mar 2007 04:52:46 GMT60JAAS 实例配置http://www.tkk7.com/hengheng123456789/archive/2007/03/10/102983.html哼哼哼哼Sat, 10 Mar 2007 05:04:00 GMThttp://www.tkk7.com/hengheng123456789/archive/2007/03/10/102983.htmlhttp://www.tkk7.com/hengheng123456789/comments/102983.htmlhttp://www.tkk7.com/hengheng123456789/archive/2007/03/10/102983.html#Feedback0http://www.tkk7.com/hengheng123456789/comments/commentRss/102983.htmlhttp://www.tkk7.com/hengheng123456789/services/trackbacks/102983.html
1、首先下载实例代?br />
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/sample_jaas.config
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SampleAcn.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SampleLoginModule.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/SamplePrincipal.java
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/tutorials/sampleacn.policy

2、SampleAcn.java 攑֜ sample 目录? SampleLoginModule.java 攑֜ sample/module 之下, ?SamplePricipal 攑֜ sample/principal 之下?br /> (tng)
3、将 config ?policy 配置文g攑ֈ目的根目录中,切记Q否则无法找到此文g?br />
4、将所有文件编译后执行以下命o(h)

java -Djava.security.auth.login.config==sample_jaas.config sample.SampleAcn

如果使用Eclipse则在Run... SampleAcn.java cL?Djava.security.auth.login.config==sample_jaas.config 参数填写入Arguments标签面的VM arguments框中?br />
5、此时在控制台显C求用戯入user name:和password:Q分别输入testUser和testPassword卛_验证通过?br />
至于Jaas原理Q大家有旉可以研究一下源代码卛_?br />

哼哼 2007-03-10 13:04 发表评论
]]>
JAAS:灉|的Java安全机制Q{Q?/title><link>http://www.tkk7.com/hengheng123456789/archive/2007/03/02/101499.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Fri, 02 Mar 2007 08:32:00 GMT</pubDate><guid>http://www.tkk7.com/hengheng123456789/archive/2007/03/02/101499.html</guid><wfw:comment>http://www.tkk7.com/hengheng123456789/comments/101499.html</wfw:comment><comments>http://www.tkk7.com/hengheng123456789/archive/2007/03/02/101499.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/hengheng123456789/comments/commentRss/101499.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hengheng123456789/services/trackbacks/101499.html</trackback:ping><description><![CDATA[ <font face="Arial"> <font size="2"> <font color="#ff1493">John Musser/Paul Feuer ?/font> <br /> <br />Java Authentication Authorization ServiceQJAASQJava验证和授权APIQ提供了(jin)灉|和可伸羃的机制来保证客户端或服务器端的JavaE序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下蝲下来的代码的d。JAAS的是通过验证谁在q行代码以及(qing)他/她的权限来保护系l面受用L(fng)d。它让你能够一些标准的安全机制Q例如Solaris NISQ网l信息服务)(j)、Windows NT、LDAPQ轻量目录存取协议)(j)QKerberos{通过一U通用的,可配|的方式集成到系l中。本文首先向你介lJAAS验证中的一些核?j)部分,然后通过例子向你展示如何开发登录模块?br /><br />  你是否曾l需要ؓ(f)一个应用程序实现登录模块呢Q如果你是一个比较有l验的程序员Q相信你q样的工作做q很多次Q而且每次都不完全一栗你有可能把你的d模块建立在Oracle数据库的基础上,也有可能使用的是NT的用户验证,或者用的是LDAP目录。如果有一U方法可以在不改变应用程序的代码的基础上支持上面提到的所有这一些安全机Ӟ对于E序员来说一定是一件幸q的事?br /><br />  现在你可以用JAAS实现上面的目标。JAAS是一个比较新的的Java API。在J2SE 1.3中,它是一个扩展包Q在J2SE 1.4中变成了(jin)一个核?j)包。在本文中,我们介lJAAS的一些核?j)概念,然后通过例子说明如何JAAS应用到实际的E序中。本文的例子是根据我们一个基于Web的Java应用E序q行改编的,在这个例子中Q我们用了(jin)关系数据库保存用L(fng)d信息。由于用了(jin)JAASQ我们实C(jin)一个健壮而灵zȝd和n份验证模块?br /><br />  <b><font color="#ac000">Java验证和授权:(x)概论</font></b><br /><br />  在JAAS出现以前QJava的安全模型是Z(jin)满跨^台的|络应用E序的需要而设计的。在Java早期版本中,Java通常是作E代码被使用Q例如AppletQ。因此最初的安全模型把注意力攑֜通过验证代码的来源来保护用户上。早期的Java安全机制中包含的概念Q如SercurityManagerQ沙概念,代码{֐Q策略文Ӟ多是Z(jin)保护用户?br /><br />  JAAS的出现反映了(jin)Java的演变。传l的服务器/客户端程序需要实现登录和存取控制QJAAS通过对运行程序的用户的进行验证,从而达C护系l的目的。虽然JAAS同时h验证和授权的能力Q在q篇文章中,我们主要介绍验证功能?br /><br />  通过在应用程序和底层的验证和授权机制之间加入一个抽象层QJAAS可以化涉?qing)到Java Security包的E序开发。抽象层独立于^台的Ҏ(gu)开发h员可以用各U不同的安全机制Q而且不用修改应用E序U的代码。和其他Java Security API怼QJAAS通过一个可扩展的框Ӟ(x)服务提供者接口(Service Provider InterfaceQSPIQ来保证E序独立于安全机制。服务提供者接口是׃l抽象类和接口组成的。图一中给Z(jin)JAASE序的整体框架图。应用程序的代码主要处理LoginContext。在LoginContext下面是一l动态配|的LoginModules。LoginModule使用正确的安全机制进行验证?br /><br />  图一l出?jin)JAAS的概览。应用程序层的代码只需要和LoginContext打交道。在LoginContext之下是一l动态配|的LoginModule对象Q这些对象用相关的安全基础l构q行验证操作?br /><br /></font> <table width="100" align="center"> <tbody> <tr align="middle"> <td> <font size="2"> <img height="396" src="http://www.yesky.com/20030114/jt-2003-1-14-image001.gif" width="573" /> <br />图一 JAAS概览 </font> </td> </tr> </tbody> </table> <br /> <font size="2">  JAAS提供?jin)一些LoginModule的参考实C码,比如JndiLoginModule。开发h员(sh)可以自己实现LoginModule接口Q就象在我们例子中的RdbmsLonginModule。同时我们还?sh)(x)告诉你如何使用一个简单的配置文g来安装应用程序?br /><br />  Z(jin)满可插接性,JAAS是可堆叠的。在单一d的情况下Q一l安全模块可以堆叠在一P然后被其他的安全机制按照堆叠的顺序被调用?br /><br />  JAAS的实现者根据现在一些流行的安全l构模式和框架将JASS模型化。例如可堆叠的特性同Unix下的可堆叠验证模块(PAMQPluggable Authentication ModuleQ框架就非常怼。从事务的角度看QJAAScM于双步提交(Two-Phase CommitQ?PCQ协议的行ؓ(f)。JAAS中安全配|的概念Q包括策略文ӞPolice FileQ和许可QPermissionQ)(j)来自于J2SE 1.2。JAASq(sh)其他成熟的安全框架中借鉴?jin)许多思想?br /><br /></font> <span id="gimoago" class="txt"> <font size="2">  <b><font color="#ac000">客户端和服务器端的JAAS</font></b><br /><br />  开发h员可以将JAAS应用到客L(fng)和服务器端。在客户端用JAAS很简单。在服务器端使用JAAS时情况要复杂一些。目前在应用服务器市(jng)Z的JAAS产品q(sh)是很一_(d)使用JAAS的J2EE应用服务器有一些细微的差别。例如JBossSx使用自己的结构,JAAS集成C(jin)一个更大的安全框架中;而虽然WebLogic 6.x也用了(jin)JAASQ安全框架却完全不一栗?br /><br />  现在你能够理解ؓ(f)什么我们需要从客户端和服务器端的角度来看JAAS?jin)。我们将在后面列ZU情况下的例子。ؓ(f)?jin)服务器端的例子程序更加简单,我们使用?jin)Resin应用服务器?br /><br />  <b><font color="#ac000">核心(j)JAASc?/font></b><br /><br />  在用JAAS之前Q你首先需要安装JAAS。在J2SE 1.4中已l包括了(jin)JAASQ但是在J2SE 1.3中没有。如果你希望使用J2SE 1.3Q你可以从SUN的官方站点上下蝲JAAS。当正确安装?jin)JAAS后,你会(x)在安装目录的lib目录下找到jaas.jar。你需要将该\径加入Classpath中。(注:(x)如果你安装了(jin)应用服务器,其中已l包括了(jin)JAASQ请阅读应用服务器的帮助文档以获得更详细的信息)(j)。在Java安全属性文件java.security中,你可以改变(sh)些与JAAS相关的系l属性。该文g保存在<jre_homeQ?lib/security目录中?br /><br />  在应用程序中使用JAAS验证通常?x)涉及(qing)到以下几个步骤Q?br /><br />  1. 创徏一个LoginContext的实例?br /><br />  2. Z(jin)能够获得和处理验证信息,一个CallBackHandler对象作ؓ(f)参数传送给LoginContext?br /><br />  3. 通过调用LoginContext的loginQ)(j)Ҏ(gu)来进行验证?br /><br />  4. 通过使用loginQ)(j)Ҏ(gu)q回的Subject对象实现一些特D的功能Q假讄录成功)(j)?br /><br />  下面是一个简单的例子Q?br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">LoginContext lc = new LoginContext("MyExample");<br />try {<br />lc.login();<br />} catch (LoginException) {<br />// Authentication failed.<br />}<br /><br />// Authentication successful, we can now continue.<br />// We can use the returned Subject if we like.<br />Subject sub = lc.getSubject();<br />Subject.doAs(sub, new MyPrivilegedAction());</font> </td> </tr> </tbody> </table> <br /> <font size="2">  在运行这D代码时Q后台进行了(jin)以下的工作?br /><br />  1. 当初始化ӞLoginContext对象首先在JAAS配置文g中找到MyExample,然后更具该项的内容决定该加蝲哪个LoginModule对象Q参见图二)(j)?br /><br />  2. 在登录时QLoginContext对象调用每个LoginModule对象的loginQ)(j)Ҏ(gu)?br /><br />  3. 每个loginQ)(j)Ҏ(gu)q行验证操作或获得一个CallbackHandle对象?br /><br />  4. CallbackHandle对象通过使用一个或多个CallBackҎ(gu)同用戯行交互,获得用户输入?br /><br />  5. 向一个新的Subject对象中填入验证信息?br /><br />  我们对代码作进一步的解释。但是在q之前,让我们先看代码中涉及(qing)到的核心(j)JAAScd接口。这些类可以被分ZU类型:(x)<br /><br />  普通类?SubjectQPrincipalQ凭?br /><br />  验证 LoginContextQLoginModuleQCallBackHandlerQCallback<br /><br />  授权 PolicyQAuthPermissionQPrivateCredentialPermission<br /><br />  上面列D的类和接口大多数都在javax.security.auth包中。在J2SE 1.4中,q有一些接口的实现cdcom.sun.security.auth包中?br /><br />  <b>普通类型:(x)SubjectQPrincipalQ凭?/b><br /><br />  SubjectcM表了(jin)一个验证实体,它可以是用户、管理员、Web服务Q设备或者其他的q程。该cd含了(jin)三中cd的安全信息:(x)<br /><br />   w䆾QIdentitiesQ:(x)׃个或多个Principal对象表示<br /><br />   公共凭证QPublic credentialsQ:(x)例如名称或公q?br /><br />   U有凭证QPrivate credentialsQ:(x)例如口o(h)或私有密?br /><br />  Principal对象代表?jin)Subject对象的n份。它们实C(jin)java.security.Principal和java.io.Serializable接口。在SubjectcMQ最重要的方法是getNameQ)(j)。该Ҏ(gu)q回一个n份名U。在Subject对象中包含了(jin)多个Principal对象Q因此它可以拥有多个名称。由于登录名U、n份证号和Email地址都可以作为用L(fng)w䆾标识Q可见拥有多个n份名U的情况在实际应用中是非常普遍的情况?br /><br />  在上面提到的凭证q不是一个特定的cL借口Q它可以是Q何对象。凭证中可以包含M特定安全pȝ需要的验证信息Q例如标{(ticketQ,密钥或口令。Subject对象中维护着一l特定的U有和公有的凭证Q这些凭证可以通过getPrivateCredentialsQ)(j)和getPublicCredentialsQ)(j)Ҏ(gu)获得。这些方法通常在应用程序层中的安全子系l被调用?br /><br />  <b>验证QLoginContext</b><br /><br />  在应用程序层中,你可以用LoginContext对象来验证Subject对象。LoginContext对象同时体现?jin)JAAS的动态可插入性(Dynamic PluggabilityQ,因ؓ(f)当你创徏一个LoginContext的实例时Q你需要指定一个配|。LoginContext通常从一个文本文件中加蝲配置信息Q这些配|信息告诉LoginContext对象在登录时使用哪一个LoginModule对象?br /><br />  下面列出?jin)在LoginContext中经怋用的三个Ҏ(gu)Q?<br /><br />  login () q行d操作。该Ҏ(gu)ȀzM(jin)配置中制定的所有LoginModule对象。如果成功,它将创徏一个经q了(jin)验证的Subject对象Q否则抛出LoginException异常?br /><br />  getSubject () q回l过验证的Subject对象<br /><br />  logout () 注销Subject对象Q删除与之相关的Principal对象和凭?br /><br />  验证QLoginModule<br /><br />  LoginModule是调用特定验证机制的接口。J2EE 1.4中包含了(jin)下面几种LoginModule的实现类Q?br /><br />  JndiLoginModule 用于验证在JNDI中配|的目录服务<br /><br />  Krb5LoginModule 使用Kerberos协议q行验证<br /><br />  NTLoginModul 使用当前用户在NT中的用户信息q行验证<br /><br />  UnixLoginModule 使用当前用户在Unix中的用户信息q行验证<br /><br />  同上面这些模块绑定在一L(fng)q有对应的Principal接口的实现类Q例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中?br /><br />  LoginModule接口中包含了(jin)五个Ҏ(gu)Q?br /><br />  initialize () 当创ZLoginModule实例时会(x)被构造函数调?br /><br />  login () q行验证<br /><br />  commit () 当LgoninContext对象接受所有LoginModule对象传回的结果后调用该Ҏ(gu)。该Ҏ(gu)Principal对象和凭证赋lSubject对象?br />  <br />  abort () 当Q何一个LoginModule对象验证p|旉?x)调用该?gu)。此时没有Q何Principal对象或凭证关联到Subject对象上?br /><br />  logout () 删除与Subject对象兌的Principal对象和凭证?br /><br />  在应用程序的代码中,E序员通常不会(x)直接调用上面列出的方法,而是通过LigonContext间接调用q些Ҏ(gu)?br /><br />  验证QCallbackHandler和Callback<br /><br />  CallbackHandler和Callback对象可以使LoginModule对象从系l和用户那里攉必要的验证信息,同时独立于实际的攉信息时发生的交互q程?br />  <br />  JAAS在javax.sevurity.auth.callback包中包含?jin)七个Callback的实现类和两个CallbackHandler的实现类QChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只会(x)在客L(fng)?x)被使用到。我在后面介绍如何~写你自qCallbackHandlercR?br /><br /></font> <span id="yswysqw" class="txt"> <font size="2">  <b><font color="#ac000">配置文g</font></b><br /><br />  上面我已l提刎ͼJAAS的可扩展性来源于它能够进行动态配|,而配|信息通常是保存在文本。这些文本文件有很多个配|块构成Q我们通常把这些配|块UC甌QApplicationQ。每个申请对应了(jin)一个或多个特定的LoginModule对象?br /><br />  当你的代码构造一个LoginContext对象Ӟ你需要把配置文g中申L(fng)名称传递给它。LoginContext会(x)Ҏ(gu)甌中的信息军_Ȁzd些LoginModule对象Q按照什么顺序激zM?qing)用什么规则激zR?br /><br />  配置文g的结构如下所C?<br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">Application {<br />ModuleClass Flag ModuleOptions;<br />ModuleClass Flag ModuleOptions;<br />...<br />};<br />Application {<br />ModuleClass Flag ModuleOptions;<br />...<br />};<br />...</font> </td> </tr> </tbody> </table> <br /> <font size="2">  下面是一个名UCؓ(f)Sample的申?br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">Sample {<br />com.sun.security.auth.module.NTLoginModule Rquired debug=true;<br />}</font> </td> </tr> </tbody> </table> <br /> <font size="2">  上面q个单的甌指定?jin)LoginContext对象应该使用NTLoginModuleq行验证。类的名U在ModuleClass中被指定。Flag控制当申请中包含?jin)多个LoginModule时进行登录时的行为:(x)Required、Sufficient、Requisite和Optional。最常用的是RequiredQ用它意味着对应的LoginModule对象必须被调用,q且必须需要通过所有的验证。由于Flag本n的复杂性,本文在这里不作深I?br /><br />  ModuleOption允许有多个参数。例如你可以讑֮调试参数为TrueQdebug=trueQ,q样诊断输出被送到System.out中?br /><br />  配置文g可以被Q意命名,q且可以被放在Q何位|。JAAS框架通过使用java.securty.auth.long.config属性来定配置文g的位|。例如当你的应用E序是JaasTestQ配|文件是当前目录下的jaas.configQ你需要在命o(h)行中输入Q?br /><br />java -Djava.security.auth.login.config=jass.config JavaTest<br /><br />  图二描述?jin)配|文件中各元素之间的关系<br /><br /></font> <table width="100" align="center"> <tbody> <tr align="middle"> <td> <font size="2"> <img height="300" src="http://www.yesky.com/20030114/jt-2003-1-14-image002.gif" width="548" /> <br />图二 JAAS的配|文?</font> </td> </tr> </tbody> </table> <br /> <font size="2">  <b><font color="#ac000">通过命o(h)行方式进行登录验?/font></b><br /><br />  Z(jin)说明JAAS到底能干什么,我在q里~写?jin)两个例子。一个是单的由命令行输入调用的程序,另一个是服务器端的JSPE序。这两个E序都通过用户名/密码的方式进行登录,然后使用关系数据库对其进行验证?br /><br />  Z(jin)通过数据库进行验证,我们需要:(x)<br /><br />  1. 实现RdbmsLoginModulc,该类可以对输入的信息q行验证?br /><br />  2. ~辑一个配|文Ӟ告诉LoginContext如何使用RdbmsLoginModule?br /><br />  3. 实现ConsoleCallbackHandlerc,通过该类可以获取用户的输入?br /><br />  4. ~写应用E序代码?br /><br />  在RdbmsLoginModulcMQ我们必d现LgoinModule接口中的五个Ҏ(gu)。首先是initializeQ)(j)Ҏ(gu)Q?br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">public void initialize(Subject subject, CallbackHandler <br />callbackHandler,<br /><br />Map sharedState, Map options)<br />{<br />this.subject = subject;<br />this.callbackHandler = callbackHandler;<br />this.sharedState = sharedState;<br />this.options = options;<br /><br />url = (String)options.get("url");<br />driverClass = (String)options.get("driver");<br />debug = "true".equalsIgnoreCase((String)options.get("debug"));<br />}</font> </td> </tr> </tbody> </table> <br /> <font size="2">  LoginContext在调用loginQ)(j)Ҏ(gu)时会(x)调用initializeQ)(j)Ҏ(gu)。RdbmsLoginModule的第一个Q务就是在cM保存输入参数的引用。在验证成功后将向Subject对象中送入Principal对象和凭证?br /><br />  CallbackHandler对象会(x)在loginQ)(j)Ҏ(gu)中被使用到。sharedState可以使数据在不同的LoginModule对象之间׃nQ但是在q个例子中我们不?x)用它。最后是名ؓ(f)options的Map对象。options向LgoinModule对象传递在配置文gModuleOption域中定义的参数的倹{配|文件如下所C:(x)<br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">Example {<br />RdbmsLoginModule required<br />driver="org.gjt.mm.mysql.Driver"<br />url="jdbc:mysql://localhost/jaasdb?user=root"<br />debug="true";<br />};</font> </td> </tr> </tbody> </table> <br /> <font size="2">  在配|文件中QRdbmsLoginModule包含?jin)五个参敎ͼ其中driver、url、user和password是必需的,而debug是可选阐q。driver、url、user和password参数告诉我们如何获得JDBCq接。当然你q可以在ModuleOption域中加入数据库中的表或列的信息。用这些参数的目的是ؓ(f)?jin)能够对数据库进行操作。在LoginModulecȝinitializeQ)(j)Ҏ(gu)中我们保存(sh)(jin)每个参数的倹{?br /><br />  我们前面提到一个LoginContext对应的配|文件告诉它应该使用文g中的哪一个申诗这个信息是通过LgoinContext的构造函C递的。下面是初始化客L(fng)的代码,在代码中创徏?jin)一个LoginContex对象q调用了(jin)loginQ)(j)Ҏ(gu)?br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">ConsoleCallbackHandler cbh = new ConsoleCallbackHandler();<br />LoginContext lc = new LoginContext("Example", cbh);<br />lc.login();</font> </td> </tr> </tbody> </table> <br /> <font size="2">  当LgoinContext.loginQ)(j)Ҏ(gu)被调用时Q它调用所有加载了(jin)的LoginModule对象的loginQ)(j)Ҏ(gu)。在我们的这个例子中是RdbmsLoginModule中的loginQ)(j)Ҏ(gu)?br /><br />  RdbmsLoginModule中的loginQ)(j)Ҏ(gu)q行?jin)下面的操作Q?br /><br />  1. 创徏两个Callback对象。这些对象从用户输入中获取用户名/密码。程序中使用?jin)JAAS中的两个Callbackc?NameCallback和PasswordCallbackQ这两个cd含在javax.security.auth.callback包中Q?br /><br />  2. 通过callbacks作ؓ(f)参数传递给C(j)allbackHandler的handleQ)(j)Ҏ(gu)来激zCallback?br /><br />  3. 通过Callback对象获得用户名/密码?br /><br />  4. 在rdbmsValidateQ)(j)Ҏ(gu)中通过JDBC在数据库中验证获取的用户名/密码?br /><br />  下面是RdbmsLoginModule中的loginQ)(j)Ҏ(gu)的代?br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">public boolean login() throws LoginException {<br />if (callbackHandler == null)<br />throw new LoginException("no handler");<br /><br />NameCallback nameCb = new NameCallback("user: ");<br />PasswordCallback passCb = new PasswordCallback("password: ", true);<br />callbacks = new Callback[] { nameCb, passCb };<br />callbackHandler.handle(callbacks);<br /><br />String username = nameCb.getName();<br />String password = new String(passCb.getPassword());<br />success = rdbmsValidate(username, password);<br /><br />return(true);<br />}</font> </td> </tr> </tbody> </table> <br /> <font size="2">  在ConsoleCallbackHandlercȝhandleQ)(j)Ҏ(gu)中你可以看到Callback对象是如何同用户q行交互的:(x)<br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">public void handle(Callback[] callbacks)<br />throws java.io.IOException, UnsupportedCallbackException {<br /><br />for (int i = 0; i Q?callbacks.length; i++) {<br />if (callbacks[i] instanceof NameCallback) {<br />NameCallback nameCb = (NameCallback)callbacks[i];<br />System.out.print(nameCb.getPrompt());<br />String user=(new BufferedReader(new <br /><br />InputStreamReader(System.in))).readLine();<br />nameCb.setName(user);<br />} else if (callbacks[i] instanceof PasswordCallback) {<br />PasswordCallback passCb = (PasswordCallback)callbacks[i];<br />System.out.print(passCb.getPrompt());<br />String pass=(new BufferedReader(new <br /><br />InputStreamReader(System.in))).readLine();<br />passCb.setPassword(pass.toCharArray());<br />} else {<br />throw(new UnsupportedCallbackException(callbacks[i],<br />"Callback class not supported"));<br />}<br />}<br />}</font> </td> </tr> </tbody> </table> <br /> <span id="qykuomu" class="txt"> <font size="2">  <b><font color="#ac000">使用JSP和关pL据库q行d验证</font></b><br /><br />  现在我们希望通过命o(h)行调用的E序一直到Web应用E序中。由于Web应用E序与一般的应用E序的交互方式有区别不同Q我们将不能使用JAAS提供的标准Callback和CallbackHandlercR因为我们不能在WebE序中打开一个命令窗口让用户输入信息。也怽?x)想到我们也可以使用ZHTTP的验证,q样我们可以从浏览器弹出的用户名Q密码窗口中获得用户输入。但是这样做也有一些问题,它要求徏立v双向的HTTPq接Q在loginQ)(j)Ҏ(gu)很难实现双向q接Q。因此在我们的例子中我们?x)用利用表单进行登录,从表单中获取用户输入的信息,然后通过RdbmsLoginModulec验证它?br /><br />  ׃我们没有在应用层同LoginModule直接打交道,而是通过LgoinContext来调用其中的Ҏ(gu)的,我们如何获得用户名和密码放入LoginModule对象中呢Q我们可以用其它的Ҏ(gu)来绕q这个问题,例如我们可以在创建LoginContext对象前先初始化一个Subject对象Q在Subject对象的凭证中保存用户名和密码。然后我们可以将该Subject对象传递给LoginContext的构造函数。这U方法虽然从技术上来说没有什么问题,但是它在应用E序层增加了(jin)很多与安全机制相关的代码。而且通常是在验证后向Subject送入凭证Q而不是之前?br />前面我们提到可以实现一个CallbackHandlerc,然后它的实例传递给LoginContext对象。在q里我们可以采用cM的方法来处理用户名和密码。我们实C(jin)一个新的类PassiveCallbackHandler。下面是在JSP中用该cȝ代码Q?br /><br /><script language="Javascript"><![CDATA[ocument.write("<img src='http://counter.yesky.com/counter.shtml?CID=72348977504190464&AID=-1&refer="+escape(document.referrer)+"&cur="+escape(document.URL)+"' border='0' alt='' width='0' height='0'>");]]></script><img height="0" alt="" src="http://counter.yesky.com/counter.shtml?CID=72348977504190464&AID=-1&refer=http%3A//www.yesky.com/20030114/1648365_2.shtml&cur=http%3A//www.yesky.com/20030114/1648365_3.shtml" width="0" border="0" /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">String user = request.getParameter("user");<br />String pass = request.getParameter("pass");<br />PassiveCallbackHandler cbh = new PassiveCallbackHandler(user, pass);<br />LoginContext lc = new LoginContext("Example", cbh); </font> </td> </tr> </tbody> </table> <br /> <font size="2">  PassiveCallbackHandler中构造函数的参数包含?jin)用户名和密码。因此它可以在Callbick对象中设定正的倹{下面是PassiveCallbackHandlercȝhandleQ)(j)Ҏ(gu)的代码:(x)<br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">public void handle(Callback[] callbacks)<br />throws java.io.IOException, UnsupportedCallbackException {<br />for (int i = 0; i Q?callbacks.length; i++) {<br />if (callbacks[i] instanceof NameCallback) {<br />NameCallback nameCb = (NameCallback)callbacks[i]; <br /><br />nameCb.setName(user);<br />} else if(callbacks[i] instanceof PasswordCallback) {<br />PasswordCallback passCb = (PasswordCallback)callbacks[i];<br />passCb.setPassword(pass.toCharArray());<br />} else {<br />throw(new UnsupportedCallbackException(callbacks[i],<br />"Callback class not supported"));<br />}<br />}<br />}<br />}</font> </td> </tr> </tbody> </table> <br /> <font size="2">  从上面的代码中可以发现实际上我们只是从ConsoleCallbackHandler中去除了(jin)那些提示用户输入的代码?br /><br />  在运行这个JSP例子的时候,我们需要设定系l属性,q样LgoinContext对象才知道如何查扑֐UCؓ(f)"Example"的配|。我们用的是Resin服务器。在resin.conf中,我们增加?jin)一个<caucho.comQ节点:(x)<br /><br /></font> <table width="100%" bgcolor="#ffffff"> <tbody> <tr> <td> <font size="2">Qsystem-property <br />java.security.auth.login.config="/resin/conf/jaas.config"/Q?</font> </td> </tr> </tbody> </table> <br /> <font size="2">  <b><font color="#ac000">结</font></b><br /><br />  JAAS通过提供动态的、可扩展的模型来q行用户验证和控制权限,从而应用E序有更加健壮的安全机制。同时它q能够让你能够很L地创qd机制。JAAS可以同时在在客户端和服务器端应用E序上工作。虽然在服务器端的JAAS到目前还?sh)是很稳定,但是随着技术的发展Q相信会(x)很好地解册个问题?br /></font> </span> </span> </span> </font> <img src ="http://www.tkk7.com/hengheng123456789/aggbug/101499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hengheng123456789/" target="_blank">哼哼</a> 2007-03-02 16:32 <a href="http://www.tkk7.com/hengheng123456789/archive/2007/03/02/101499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>验证代码合法性的新工P转)(j)http://www.tkk7.com/hengheng123456789/archive/2006/11/08/79922.html哼哼哼哼Wed, 08 Nov 2006 10:05:00 GMThttp://www.tkk7.com/hengheng123456789/archive/2006/11/08/79922.htmlhttp://www.tkk7.com/hengheng123456789/comments/79922.htmlhttp://www.tkk7.com/hengheng123456789/archive/2006/11/08/79922.html#Feedback0http://www.tkk7.com/hengheng123456789/comments/commentRss/79922.htmlhttp://www.tkk7.com/hengheng123456789/services/trackbacks/79922.html (tng) (tng) (tng)随着来多的开源Y件投入用,许多企业开始采取防范措施,以免无意中R犯他人的知识产权?br />
 (tng) (tng) (tng)以Linux操作pȝ和Apache Web服务器Y件ؓ(f)代表的开源Y件越来越受到Ƣ迎Q其应用范围也从原来的一些小部门深入C(jin)整个企业IT环境中。虽然绝大多C业对开源Y件的使用?qing)其相关的法律问题还(sh)熟?zhn),但是Q当出现늊知识产权问题Ӟ无知q不能解决问题?

 (tng) (tng) (tng) 随着开源Y件的行Q出C(jin)很多新兴工具与服务来帮助企业识别开源Y件中的代码知识权。这些Y件或者是从互联网上免费下载下来的Q或者是通过传统贸易方式从其他企业那儿买来的?/p>

 (tng) (tng) (tng) 黑鸭软g公司QBlack Duck Software Inc.Q在2004q?月推Z(jin)protexIP/development 开发Y件和服务Q此后又推出?jin)protexIP/license management许可理软g和服务。前者能帮助开发h员识别开源Y件的状况Q判断是否存在许可冲H问题;而后者主要针对律师和公司法律部门Q帮助他们识别开源Y件的许可是否?x)涉及(qing)到他们客户的代码,或者他们客户希望购买的代码?/p>

 (tng) (tng) (tng) 当管理层考虑收购一家公司或者一家公司的资Ӟ他们不希望存在未被发现的法律地雷Q泰斯塔公司QTestaQ专利和知识产权业务部门的合伙h大卫·拜尔QDavid ByerQ说。泰斯塔公司是一家位于L士顿QBostonQ的法律公司Q隶属于赫维茨与蒂柏?dng)律师事务所QHurwitz & Thibeault LLCQ。“我们就曄睹过整个交易谈判因ؓ(f)收购者不x担风险而被q中止的情况。”拜?dng)说。除?jin)风险外Q另一个原因是如果q些被收购的财存在法律归属的问题,被收购方的胦(ch)产就?x)贬倹{?/p>

 (tng) (tng) (tng) 那些可以从网上直接免费下载而无需通过公司采购渠道采购的开源Y件日益流行,增加?jin)公司Y件收购与使用的法律风险。ؓ(f)?jin)确保其律师团队能帮助客户减轻这c风险,泰斯塔公司正在测试protexIP/license management和protexIP/development软g?/p>

 (tng) (tng) (tng) 黑鸭软g公司有一个包含超q?00个开源Y件许可的数据库。泰斯塔公司的律师用protexIP/license management软gQ就可以把其客户所希望购买的Y件的代码与黑鸭Y件公司的数据库做比较Q看看这些代码是否在许可的范围之内。依拉¯凡(Ira HeffanQ介l,律师们也可以用黑鸭Y件公司的软g来运行源代码Q确定源代码与包含在开源应用程序中代码之间的相似性。赫凡是泰斯塔公怸利和知识产权业务部门的高U合伙hQ同时也是公司开源Y件特别小l的成员。该特别组由来自公司多个业务部门的15位律师的律师l成。他们所研究的开源问题,涉及(qing)到Y件开发、知识权R犯、风险资本融资中的知识权尽责调查、ƈ购交易和股票首次公开发行?/p>

 (tng) (tng) (tng) 更危险的情况是,一家公司在开发环境中引入受到通用公共许可证(General Public LicenseQ保护的软gQ但自己q不知道Q这其Y件代码免费向开源社区开放,其中一些代码很可能是公司独家开发的Q赫凡说?/p>

 (tng) (tng) (tng) 购买protexIP/license management软g许可的h(hun)格是每两个用?,500元。protexIP/license management软g?qing)服务必M黑鸭软g公司的protexIP/development软g一起用,后者的h是每五个用户1.25万美元。ProtexIP/license management软g使用的数据库Q与黑鸭软g公司在其protexIP/development软g服务中用的一致?/p>

哼哼 2006-11-08 18:05 发表评论
]]>
վ֩ģ壺 AVרAV԰| ޾Ʒ| AVպƷþþþþ | AVƷɫ| һɫëƬѿ| ѾƷԲĹۿ| av֮˵վ| ִˬƵ| պaëƬa| ޹Ʒ˾ƷС˵ | Ʒվ| þþƷۺһƷ| AëƬƵл| ަvþþ| 2019ĻѵӰ߲ | ޸Ƶ| 뾫ƷһƵ| 91޾Ʒר| ߿ƬƵ| պһĺ| ѹۿ㶮| 뾫Ʒ| 9ѾƷƵ߹ۿ| ޾ƷҳĻ | jizzjizzƵ| ҹ븣Ƶ| ߹ۿѳ| һɪ| վ߹ۿ| ݾ߹ۿվ| Avۺɫרɫ | ػɫƬ| ޾Ʒ΢ľƷ| 99þѹۿ| ޾ƷƬþò| ޹պۺ| 3dƷžžһ| AVӰԺۿ| ޾ƷĻ| һ߹ۿƵ| ŷһëƬѿ|