JAAS简介及实例.doc_第1页
JAAS简介及实例.doc_第2页
JAAS简介及实例.doc_第3页
JAAS简介及实例.doc_第4页
JAAS简介及实例.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAAS简介及实例JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到代码中)。JAAS采用的是插件的运行方式,一开始就被设计成可插拔的(Pluggable),根据应用的需要,只要配置一下JAAS的配置文件,这些组件即可包含 在我们的应用程序中。使用JAAS包接口,开发者和第三方可以开发一些组件或者BEAN来实现登陆认证,或者通过与使用者或外部的系统的进行交互来访问认 证信息(当然我们可以设计更为稳妥安全的密码学协议)。JAAS提供了一组用于用户鉴别的类和接口,这意味着支持JAAS的应用会要求用户登陆,同时 JAAS提供了另一组用于用户授权的类和接口。在讨论例子之前,先对JAAS API中常用的一些类和接口做个简单的说明。LoginModule :确认用户的合法性(使用CallbackHandler或者其他类方法),并分配访问权限principal给subject;LoginContext:为了实现用户鉴别,建立相应的环境,从配置文件中导入规则;CallbackHandler:回调处理器,负责与用户(代码拥有者和执行者)交互,确认其身份的合法性;Subject:表示登陆处理的目标,即一个被鉴别的用户。并可关联一个或多个pirncipal;Principal:表示具有访问权限的一个实体,可以看作是可以执行某种操作的证件。理解这些类和接口的关系我给个生动的比方:一个军事学校,入学的时候校方(LoginModule)根据学生(Subject)的入学通知来确定其合法 性,这个过程交由某工作人员(CallbackHandler)执行,(CallbackHandler)确认后,(LoginModule)给不同 (Subject)根据其身份发给相关的证件(Principal),有了该证件就可以访问对应的资源,(Subject)根据自己的 (Principal)的级别可以使用和访问学校不同资源。一个(Subject)的(Principal)如果是士官级,那么可以访问的资源就相对少些,如果是将军级那就多些。当然一个(Subject)可以拥有多个(Principal)。通过分析我们会发现,JAAS采用的也是身份检查权限分配模式。因此JAAS的应用也分成两个部分:(1)认证;(2)授权。过程是先认证后根据身份来授权(有歧视的嫌疑的东东,本人可是反歧视人士)。那么JAAS是如何实现认证的呢?又是如何实现授权的呢?且听我慢慢分解,将其妙处展现给大家。二 JAAS的认证原理(1) 设置JAAS配置文件,关于配置非常有技巧,跟设置防火墙的过滤规则有得一拼;(2) 根据JAAS配置文件的条目加载一个或者多个LoginModule(通常一个,也可以变态得使用多个);(3) 为了管理用户认证的有关过程,将提供一个可选的LoginModule构造函数和一个回调处理器CallbackHandler。如果没有在构造函数中提供回调处理器,系统采用默认设置;(4) 初始并实例化LoginContext(加载配置规则),如果成功,则调用LoginContext的login方法。无论是否需 要,LoginContext都会去首先读取JAAS配置文件,从中获得要加载的登陆模块信息,其initialize方法将按照配置文件中的相关内容提 供LoginModule运行所需要的信息;(5) LoginContext的login方法将调用LoginModule的login方法,确定用户身份。该方法将设置相关的回调,并由回调处理器CallbackHandler来管理登陆处理回调;(6) LoginModule的login方法将负责与用户进行交互(可能是人机交互,也可能是机机交互),如果用户输入信息无效,则该方 法返回FALSE,一次交互过程结束,如果用户输入信息有效,则该方法将设置Principal对象的Subject对象,并返回TRUE;当然 LoginModule也可以将与用户之间的所有交互过程全部委托给处理器CallbackHandler来处理。如果登陆成功, LoginContext将调用LoginModule的commit方法将结果提交给LoginModule实例的内部状态。在应用程序中使用JAAS验证通常会涉及到以下几个步骤:1. 创建一个LoginContext的实例。2. 为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数传送给LoginContext。3. 通过调用LoginContext的login()方法来进行验证。4. 通过使用login()方法返回的Subject对象实现一些特殊的功能(假设登录成功)。下面是一个简单的例子: SimpleLogin.javaJava代码1. packagecom;2. 3. importjavax.security.auth.login.LoginContext;4. importjavax.security.auth.login.LoginException;5. 6. publicclassSimpleLogin7. 8. publicstaticvoidmain(Stringargs)9. 10. /建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录11. LoginContextloginContext=null;12. try13. 14. loginContext=newLoginContext(simple,newSimpleCallbackHandle();15. catch(LoginExceptione)16. 17. System.out.println(e.getMessage();18. 19. 20. try21. 22. /如果不抛出异常表示验证成功23. loginContext.login();24. catch(LoginExceptione)25. 26. 27. 28. 29. SimpleCallbackHandle.javaJava代码1. packagecom;2. 3. importjava.io.BufferedReader;4. importjava.io.IOException;5. importjava.io.InputStreamReader;6. importjavax.security.auth.callback.Callback;7. importjavax.security.auth.callback.CallbackHandler;8. importjavax.security.auth.callback.NameCallback;9. importjavax.security.auth.callback.PasswordCallback;10. importjavax.security.auth.callback.UnsupportedCallbackException;11. 12. publicclassSimpleCallbackHandleimplementsCallbackHandler13. 14. publicvoidhandle(Callbackcallbacks)throwsIOException,15. UnsupportedCallbackException16. 17. for(Callbackcallback:callbacks)18. 19. if(callbackinstanceofNameCallback)20. NameCallbacknc=(NameCallback)callback;21. 22. System.out.print(nc.getPrompt();23. System.out.flush();24. 25. nc.setName(newBufferedReader(newInputStreamReader(26. System.in).readLine();27. elseif(callbackinstanceofPasswordCallback)28. PasswordCallbackpcb=(PasswordCallback)callback;29. 30. System.out.print(pcb.getPrompt();31. System.out.flush();32. pcb.setPassword(newBufferedReader(newInputStreamReader(33. System.in).readLine().toCharArray();34. 35. 36. 37. SimpleLoginModule.javaJava代码1. packagecom;2. 3. importjava.io.IOException;4. importjava.util.Map;5. 6. importjavax.security.auth.Subject;7. importjavax.security.auth.callback.Callback;8. importjavax.security.auth.callback.CallbackHandler;9. importjavax.security.auth.callback.NameCallback;10. importjavax.security.auth.callback.PasswordCallback;11. importjavax.security.auth.callback.UnsupportedCallbackException;12. importjavax.security.auth.login.LoginException;13. importjavax.security.auth.spi.LoginModule;14. 15. publicclassSimpleLoginModuleimplementsLoginModule16. 17. privateStringuserName;18. 19. privatecharpassword;20. 21. privateSubjectsubject;22. 23. privateCallbackHandlercallbackHandler;24. 25. privateMapsharedState;26. 27. privateMapoptions;28. 29. privateStringdebug;30. 31. publicbooleanabort()throwsLoginException32. System.out.println(abort();33. returnfalse;34. 35. 36. publicbooleancommit()throwsLoginException37. System.out.println(commit();38. returnfalse;39. 40. 41. publicvoidinitialize(Subjectsubject,CallbackHandlercallbackHandler,42. MapsharedState,Mapoptions)43. 44. this.subject=subject;45. this.callbackHandler=callbackHandler;46. this.sharedState=sharedState;47. this.options=options;48. 49. debug=(String)options.get(debug);50. 51. 52. publicbooleanlogin()throwsLoginException53. 54. Callbackcallbacks=newCallback2;55. callbacks0=newNameCallback(用户名:);56. callbacks1=newPasswordCallback(密码:,false);57. 58. try59. 60. callbackHandler.handle(callbacks);61. userName=(NameCallback)callbacks0).getName();62. password=(PasswordCallback)callbacks1).getPassword();63. 64. if(debug.equals(true)65. System.out.println(你输入的用户名为:+userName);66. System.out.println(你输入的密码为:+newString(password);67. 68. 69. if(userName.equals(callan)&newString(password).equals(callanpass)70. System.out.println(验证成功);71. returntrue;72. else73. System.out.println(验证失败);74. userName=null;75. password=null;76. 77. catch(IOExceptione)78. e.printStackTrace();79. catch(UnsupportedCallbackExceptione)80. e.printStack

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论