Jaas demo 登陆验证
生活随笔
收集整理的這篇文章主要介紹了
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;?? ????}?? ?? }?
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代碼 ?
Java代碼 ?
Java代碼 ?
Xml代碼 ?
Java代碼 ?
總結
以上是生活随笔為你收集整理的Jaas demo 登陆验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue引用阿里云iconfont使用ic
- 下一篇: Val编程-界面编程