Jaas demo 登陆验证
生活随笔
收集整理的這篇文章主要介紹了
Jaas demo 登陆验证
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JAAS的核心類和接口可以被分為三種類型,大多數(shù)都在javax.security.auth包中。在J2SE 1.4中,還有一些接口的實(shí)現(xiàn)類在com.sun.security.auth包中,如下所示:
1、???? 普通類 Subject,Principal,Credential(憑證)
Subject類代表了一個(gè)驗(yàn)證實(shí)體,它可以是用戶、管理員、Web服務(wù),設(shè)備或者其他的過程。該類包含了三中類型的安全信息:
1)??????? 身份(Identities):由一個(gè)或多個(gè)Principal對(duì)象表示
2)??????? 公共憑證(Public credentials):例如名稱或公共密鑰
3)??????? 私有憑證(Private credentials):例如口令或私有密鑰
Principal對(duì)象代表了Subject對(duì)象的身份。它們實(shí)現(xiàn)了java.security.Principal和java.io.Serializable接口。在Principal類中,最重要的方法是getName()。該方法返回一個(gè)身份名稱。在Subject對(duì)象中包含了多個(gè)Principal對(duì)象,因此它可以擁有多個(gè)名稱。由于登錄名稱、身份證號(hào)和Email地址都可以作為用戶的身份標(biāo)識(shí),可見擁有多個(gè)身份名稱的情況在實(shí)際應(yīng)用中是非常普遍的情況。
在上面提到的憑證并不是一個(gè)特定的類或借口,它可以是任何對(duì)象。憑證中可以包含任何特定安全系統(tǒng)需要的驗(yàn)證信息,例如標(biāo)簽(ticket),密鑰或口令。Subject對(duì)象中維護(hù)著一組特定的私有和公有的憑證,這些憑證可以通過Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應(yīng)用程序?qū)又械陌踩酉到y(tǒng)被調(diào)用。
2、??? 驗(yàn)證 LoginContext,LoginModule,CallBackHandler,Callback
驗(yàn)證:LoginContext
在應(yīng)用程序?qū)又?#xff0c;你可以使用LoginContext對(duì)象來驗(yàn)證Subject對(duì)象。LoginContext對(duì)象同時(shí)體現(xiàn)了JAAS的動(dòng)態(tài)可插入性(Dynamic Pluggability),因?yàn)楫?dāng)你創(chuàng)建一個(gè)LoginContext的實(shí)例時(shí),你需要指定一個(gè)配置。LoginContext通常從一個(gè)文本文件中加載配置信息,這些配置信息告訴LoginContext對(duì)象在登錄時(shí)使用哪一個(gè)LoginModule對(duì)象。
下面列出了在LoginContext中經(jīng)常使用的三個(gè)方法:
《1》???????? login () 進(jìn)行登錄操作。該方法激活了配置中制定的所有LoginModule對(duì) 象。如果成功,它將創(chuàng)建一個(gè)經(jīng)過了驗(yàn)證的Subject對(duì)象;否則拋出LoginException異常。
《2》??????? getSubject () 返回經(jīng)過驗(yàn)證的Subject對(duì)象
《3》??????? logout () 注銷Subject對(duì)象,刪除與之相關(guān)的Principal對(duì)象和憑證
驗(yàn)證:LoginModule
LoginModule是調(diào)用特定驗(yàn)證機(jī)制的接口。J2EE 1.4中包含了下面幾種LoginModule的實(shí)現(xiàn)類:
《1》??????? JndiLoginModule 用于驗(yàn)證在JNDI中配置的目錄服務(wù)
《2》??????? Krb5LoginModule 使用Kerberos協(xié)議進(jìn)行驗(yàn)證
《3》??????? NTLoginModul 使用當(dāng)前用戶在NT中的用戶信息進(jìn)行驗(yàn)證
《4》?????? UnixLoginModule 使用當(dāng)前用戶在Unix中的用戶信息進(jìn)行驗(yàn)證
同上面這些模塊綁定在一起的還有對(duì)應(yīng)的Principal接口的實(shí)現(xiàn)類,例如NTDomainPrincipal和UnixPrincipal。這些類在com.sun.security.auth包中。
LoginModule接口中包含了五個(gè)方法:
1)??????? initialize () 當(dāng)創(chuàng)建一LoginModule實(shí)例時(shí)會(huì)被構(gòu)造函數(shù)調(diào)用
2)??????? login () 進(jìn)行驗(yàn)證,通常會(huì)按照登錄條件生成若干個(gè)Principal對(duì)象
3)??????? commit () 進(jìn)行Principal對(duì)象檢驗(yàn),按照預(yù)定義Principal條件檢驗(yàn)Login生成的Principal對(duì)象,所有需要的條件均符合后,把若干個(gè)生成的Principal對(duì)象付給Subject對(duì)象,JAAS架構(gòu)負(fù)責(zé)回傳給LoginContext.
4)??????? abort () 當(dāng)任何一個(gè)LoginModule對(duì)象驗(yàn)證失敗時(shí)都會(huì)調(diào)用該方法。任何已經(jīng)和Subject對(duì)象綁定的Principal對(duì)象都會(huì)被解除綁定。
5)??????? logout () 刪除與Subject對(duì)象關(guān)聯(lián)的Principal對(duì)象和憑證,消除Subject,Principal等認(rèn)證對(duì)象。
驗(yàn)證:CallbackHandler和Callback
CallbackHandler和Callback對(duì)象可以使LoginModule對(duì)象從系統(tǒng)和用戶那里收集必要的驗(yàn)證信息,同時(shí)獨(dú)立于實(shí)際的收集信息時(shí)發(fā)生的交互過程。
JAAS在javax.sevurity.auth.callback包中包含了七個(gè)Callback的實(shí)現(xiàn)類和兩個(gè)CallbackHandler的實(shí)現(xiàn)類:ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只會(huì)在客戶端會(huì)被使用到。我將在后面介紹如何編寫你自己的CallbackHandler類。
3、???? 授權(quán) 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?? ???{?? ????//設(shè)置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?? ???{?? ????//?如果不拋出異常表示驗(yàn)證成功?? ????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("驗(yàn)證成功");?? ?????return?true;?? ????}?? ????else?? ????{?? ?????System.out.println("驗(yàn)證失敗");?? ?????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類代表了一個(gè)驗(yàn)證實(shí)體,它可以是用戶、管理員、Web服務(wù),設(shè)備或者其他的過程。該類包含了三中類型的安全信息:
1)??????? 身份(Identities):由一個(gè)或多個(gè)Principal對(duì)象表示
2)??????? 公共憑證(Public credentials):例如名稱或公共密鑰
3)??????? 私有憑證(Private credentials):例如口令或私有密鑰
Principal對(duì)象代表了Subject對(duì)象的身份。它們實(shí)現(xiàn)了java.security.Principal和java.io.Serializable接口。在Principal類中,最重要的方法是getName()。該方法返回一個(gè)身份名稱。在Subject對(duì)象中包含了多個(gè)Principal對(duì)象,因此它可以擁有多個(gè)名稱。由于登錄名稱、身份證號(hào)和Email地址都可以作為用戶的身份標(biāo)識(shí),可見擁有多個(gè)身份名稱的情況在實(shí)際應(yīng)用中是非常普遍的情況。
在上面提到的憑證并不是一個(gè)特定的類或借口,它可以是任何對(duì)象。憑證中可以包含任何特定安全系統(tǒng)需要的驗(yàn)證信息,例如標(biāo)簽(ticket),密鑰或口令。Subject對(duì)象中維護(hù)著一組特定的私有和公有的憑證,這些憑證可以通過Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應(yīng)用程序?qū)又械陌踩酉到y(tǒng)被調(diào)用。
2、??? 驗(yàn)證 LoginContext,LoginModule,CallBackHandler,Callback
驗(yàn)證:LoginContext
在應(yīng)用程序?qū)又?#xff0c;你可以使用LoginContext對(duì)象來驗(yàn)證Subject對(duì)象。LoginContext對(duì)象同時(shí)體現(xiàn)了JAAS的動(dòng)態(tài)可插入性(Dynamic Pluggability),因?yàn)楫?dāng)你創(chuàng)建一個(gè)LoginContext的實(shí)例時(shí),你需要指定一個(gè)配置。LoginContext通常從一個(gè)文本文件中加載配置信息,這些配置信息告訴LoginContext對(duì)象在登錄時(shí)使用哪一個(gè)LoginModule對(duì)象。
下面列出了在LoginContext中經(jīng)常使用的三個(gè)方法:
《1》???????? login () 進(jìn)行登錄操作。該方法激活了配置中制定的所有LoginModule對(duì) 象。如果成功,它將創(chuàng)建一個(gè)經(jīng)過了驗(yàn)證的Subject對(duì)象;否則拋出LoginException異常。
《2》??????? getSubject () 返回經(jīng)過驗(yàn)證的Subject對(duì)象
《3》??????? logout () 注銷Subject對(duì)象,刪除與之相關(guān)的Principal對(duì)象和憑證
驗(yàn)證:LoginModule
LoginModule是調(diào)用特定驗(yàn)證機(jī)制的接口。J2EE 1.4中包含了下面幾種LoginModule的實(shí)現(xiàn)類:
《1》??????? JndiLoginModule 用于驗(yàn)證在JNDI中配置的目錄服務(wù)
《2》??????? Krb5LoginModule 使用Kerberos協(xié)議進(jìn)行驗(yàn)證
《3》??????? NTLoginModul 使用當(dāng)前用戶在NT中的用戶信息進(jìn)行驗(yàn)證
《4》?????? UnixLoginModule 使用當(dāng)前用戶在Unix中的用戶信息進(jìn)行驗(yàn)證
同上面這些模塊綁定在一起的還有對(duì)應(yīng)的Principal接口的實(shí)現(xiàn)類,例如NTDomainPrincipal和UnixPrincipal。這些類在com.sun.security.auth包中。
LoginModule接口中包含了五個(gè)方法:
1)??????? initialize () 當(dāng)創(chuàng)建一LoginModule實(shí)例時(shí)會(huì)被構(gòu)造函數(shù)調(diào)用
2)??????? login () 進(jìn)行驗(yàn)證,通常會(huì)按照登錄條件生成若干個(gè)Principal對(duì)象
3)??????? commit () 進(jìn)行Principal對(duì)象檢驗(yàn),按照預(yù)定義Principal條件檢驗(yàn)Login生成的Principal對(duì)象,所有需要的條件均符合后,把若干個(gè)生成的Principal對(duì)象付給Subject對(duì)象,JAAS架構(gòu)負(fù)責(zé)回傳給LoginContext.
4)??????? abort () 當(dāng)任何一個(gè)LoginModule對(duì)象驗(yàn)證失敗時(shí)都會(huì)調(diào)用該方法。任何已經(jīng)和Subject對(duì)象綁定的Principal對(duì)象都會(huì)被解除綁定。
5)??????? logout () 刪除與Subject對(duì)象關(guān)聯(lián)的Principal對(duì)象和憑證,消除Subject,Principal等認(rèn)證對(duì)象。
驗(yàn)證:CallbackHandler和Callback
CallbackHandler和Callback對(duì)象可以使LoginModule對(duì)象從系統(tǒng)和用戶那里收集必要的驗(yàn)證信息,同時(shí)獨(dú)立于實(shí)際的收集信息時(shí)發(fā)生的交互過程。
JAAS在javax.sevurity.auth.callback包中包含了七個(gè)Callback的實(shí)現(xiàn)類和兩個(gè)CallbackHandler的實(shí)現(xiàn)類:ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只會(huì)在客戶端會(huì)被使用到。我將在后面介紹如何編寫你自己的CallbackHandler類。
3、???? 授權(quán) Policy,AuthPermission,PrivateCredentialPermission
Java代碼 ?
Java代碼 ?
Java代碼 ?
Xml代碼 ?
Java代碼 ?
總結(jié)
以上是生活随笔為你收集整理的Jaas demo 登陆验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue引用阿里云iconfont使用ic
- 下一篇: Val编程-界面编程