日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jaas demo 登陆验证

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jaas demo 登陆验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAAS的核心類和接口可以被分為三種類型,大多數都在javax.security.auth包中。在J2SE 1.4中,還有一些接口的實現類在com.sun.security.auth包中,如下所示:
1、???? 普通類 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地址都可以作為用戶的身份標識,可見擁有多個身份名稱的情況在實際應用中是非常普遍的情況。
在上面提到的憑證并不是一個特定的類或借口,它可以是任何對象。憑證中可以包含任何特定安全系統需要的驗證信息,例如標簽(ticket),密鑰或口令。Subject對象中維護著一組特定的私有和公有的憑證,這些憑證可以通過Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應用程序層中的安全子系統被調用。
2、??? 驗證 LoginContext,LoginModule,CallBackHandler,Callback
驗證:LoginContext
  在應用程序層中,你可以使用LoginContext對象來驗證Subject對象。LoginContext對象同時體現了JAAS的動態可插入性(Dynamic Pluggability),因為當你創建一個LoginContext的實例時,你需要指定一個配置。LoginContext通常從一個文本文件中加載配置信息,這些配置信息告訴LoginContext對象在登錄時使用哪一個LoginModule對象。
  下面列出了在LoginContext中經常使用的三個方法:
《1》???????? login () 進行登錄操作。該方法激活了配置中制定的所有LoginModule對 象。如果成功,它將創建一個經過了驗證的Subject對象;否則拋出LoginException異常。
《2》??????? getSubject () 返回經過驗證的Subject對象
《3》??????? logout () 注銷Subject對象,刪除與之相關的Principal對象和憑證
  驗證:LoginModule
  LoginModule是調用特定驗證機制的接口。J2EE 1.4中包含了下面幾種LoginModule的實現類:
《1》??????? JndiLoginModule 用于驗證在JNDI中配置的目錄服務
《2》??????? Krb5LoginModule 使用Kerberos協議進行驗證
《3》??????? NTLoginModul 使用當前用戶在NT中的用戶信息進行驗證
《4》?????? 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接口只會在客戶端會被使用到。我將在后面介紹如何編寫你自己的CallbackHandler類。

3、???? 授權 Policy,AuthPermission,PrivateCredentialPermission


Java代碼 ?
  • package?com.sss;??
  • ??
  • import?javax.security.auth.login.LoginContext;??
  • import?javax.security.auth.login.LoginException;??
  • ??
  • public?class?SimpleLogin??
  • {??
  • public?static?void?main(String[]?args)??
  • {??
  • ???//?建立登陸上下文,并通過配置文件初始化,在這里配置文件必須與程序同目錄??
  • ???LoginContext?loginContext?=?null;??
  • ???try??
  • ???{??
  • ????//設置JAAS配置文件??
  • ????System.setProperty("java.security.auth.login.config",?"D:\\install\\eclipse\\workspace\\springtest\\jaas.config");??
  • ????loginContext?=?new?LoginContext("simple",new?SimpleCallbackHandle());??
  • ???}??
  • ???catch?(LoginException?e)??
  • ???{??
  • ????System.out.println(e.getMessage());??
  • ???}??
  • ???try??
  • ???{??
  • ????//?如果不拋出異常表示驗證成功??
  • ????loginContext.login();??
  • ??Subject??subject?=loginContext.getSubject();??
  • //????subject.d??
  • ????Subject.doAs(subject,?new?MyPrivilege());??
  • ???}??
  • ???catch?(LoginException?e)??
  • ???{??
  • ???}??
  • }??
  • }??




  • Java代碼 ?
  • package?com.sss;??
  • ??
  • import?java.io.IOException;??
  • ??
  • import?javax.security.auth.callback.Callback;??
  • import?javax.security.auth.callback.CallbackHandler;??
  • import?javax.security.auth.callback.NameCallback;??
  • import?javax.security.auth.callback.PasswordCallback;??
  • import?javax.security.auth.callback.UnsupportedCallbackException;??
  • ??
  • public?class?SimpleCallbackHandle?implements?CallbackHandler??
  • {??
  • public?void?handle(Callback[]?callbacks)?throws?IOException,??
  • ????UnsupportedCallbackException??
  • {??
  • ???for?(Callback?callback?:?callbacks)??
  • ???{??
  • ????if?(callback?instanceof?NameCallback)??
  • ????{??
  • ?????NameCallback?nc?=?(NameCallback)?callback;??
  • ?????System.out.print(nc.getPrompt()+"1111");??
  • ?????System.out.flush();??
  • ?????nc.setName("dibin");??
  • //?????nc.setName((new?BufferedReader(new?InputStreamReader(??
  • //?????????System.in))).readLine());??
  • ????}??
  • ????else?if?(callback?instanceof?PasswordCallback)??
  • ????{??
  • ?????PasswordCallback?pcb?=?(PasswordCallback)?callback;??
  • ?????System.out.print(pcb.getPrompt());??
  • ?????System.out.flush();??
  • ??????
  • ?????pcb.setPassword(new?char[]{'d','i','b','i','n'});??
  • //?????pcb.setPassword((new?BufferedReader(new?InputStreamReader(??
  • //???????System.in))).readLine().toCharArray());??
  • ????}??
  • ???}??
  • }??
  • }??




  • Java代碼 ?
  • package?com.sss;??
  • ??
  • import?java.io.IOException;??
  • import?java.util.Map;??
  • ??
  • import?javax.security.auth.Subject;??
  • import?javax.security.auth.callback.Callback;??
  • import?javax.security.auth.callback.CallbackHandler;??
  • import?javax.security.auth.callback.NameCallback;??
  • import?javax.security.auth.callback.PasswordCallback;??
  • import?javax.security.auth.callback.UnsupportedCallbackException;??
  • import?javax.security.auth.login.LoginException;??
  • import?javax.security.auth.spi.LoginModule;??
  • ??
  • public?class?SimpleLoginModule?implements?LoginModule??
  • {??
  • private?String?userName;??
  • private?char[]?password;??
  • private?Subject?subject;??
  • private?CallbackHandler?callbackHandler;??
  • private?Map?sharedState;??
  • private?Map?options;??
  • private?String?debug;??
  • public?boolean?abort()?throws?LoginException??
  • {??
  • ???System.out.println("abort()");??
  • ???return?false;??
  • }??
  • public?boolean?commit()?throws?LoginException??
  • {??
  • ???System.out.println("commit()");??
  • ???return?true;??
  • }??
  • public?void?initialize(Subject?subject,?CallbackHandler?callbackHandler,??
  • ????Map?sharedState,?Map?options)??
  • {??
  • ???this.subject?=?subject;??
  • ???this.callbackHandler?=?callbackHandler;??
  • ???this.sharedState?=?sharedState;??
  • ???this.options?=?options;??
  • ???debug?=?(String)?options.get("debug");??
  • }??
  • public?boolean?login()?throws?LoginException??
  • {??
  • ????System.out.println("**********************");??
  • ???Callback[]?callbacks?=?new?Callback[2];??
  • ???callbacks[0]?=?new?NameCallback("用戶名:?");??
  • ???callbacks[1]?=?new?PasswordCallback("密碼:?",?false);??
  • ???try??
  • ???{??
  • ????callbackHandler.handle(callbacks);??
  • ????userName?=?((NameCallback)?callbacks[0]).getName();??
  • ????password?=?((PasswordCallback)?callbacks[1]).getPassword();??
  • ????if?(debug.equals("true"))??
  • ????{??
  • ?????System.out.println("你輸入的用戶名為:"?+?userName);??
  • ?????System.out.println("你輸入的密碼為:"?+?new?String(password));??
  • ????}??
  • ????if?(userName.equals("dibin")??
  • ??????&&?new?String(password).equals("dibin"))??
  • ????{??
  • ?????System.out.println("驗證成功");??
  • ?????return?true;??
  • ????}??
  • ????else??
  • ????{??
  • ?????System.out.println("驗證失敗");??
  • ?????userName?=?null;??
  • ?????password?=?null;??
  • ????}??
  • ???}??
  • ???catch?(IOException?e)??
  • ???{??
  • ????e.printStackTrace();??
  • ???}??
  • ???catch?(UnsupportedCallbackException?e)??
  • ???{??
  • ????e.printStackTrace();??
  • ???}??
  • ???return?false;??
  • }??
  • public?boolean?logout()?throws?LoginException??
  • {??
  • ???System.out.println("logout()");??
  • ???return?false;??
  • }??
  • }??



  • Xml代碼 ?
  • simple?{?????
  • ???com.sss.SimpleLoginModule?required?debug=true;?????
  • };??



  • Java代碼 ?
  • package?com.sss;??
  • ??
  • import?java.security.PrivilegedAction;??
  • import?java.security.PrivilegedActionException;??
  • ??
  • public?class?MyPrivilege?implements?PrivilegedAction{??
  • ??
  • ????public?Object?run()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????System.out.println("this?is??run??method");??
  • ????????return?null;??
  • ????}??
  • ??
  • }?
  • 總結

    以上是生活随笔為你收集整理的Jaas demo 登陆验证的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。