Jaas demo 登陆验证

来源:互联网 发布:阿里云干嘛的 编辑:程序博客网 时间:2024/05/29 12:37
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代码  收藏代码
  1. package com.sss;  
  2.   
  3. import javax.security.auth.login.LoginContext;  
  4. import javax.security.auth.login.LoginException;  
  5.   
  6. public class SimpleLogin  
  7. {  
  8. public static void main(String[] args)  
  9. {  
  10.    // 建立登陆上下文,并通过配置文件初始化,在这里配置文件必须与程序同目录  
  11.    LoginContext loginContext = null;  
  12.    try  
  13.    {  
  14.     //设置JAAS配置文件  
  15.     System.setProperty("java.security.auth.login.config""D:\\install\\eclipse\\workspace\\springtest\\jaas.config");  
  16.     loginContext = new LoginContext("simple",new SimpleCallbackHandle());  
  17.    }  
  18.    catch (LoginException e)  
  19.    {  
  20.     System.out.println(e.getMessage());  
  21.    }  
  22.    try  
  23.    {  
  24.     // 如果不抛出异常表示验证成功  
  25.     loginContext.login();  
  26.   Subject  subject =loginContext.getSubject();  
  27. //    subject.d  
  28.     Subject.doAs(subject, new MyPrivilege());  
  29.    }  
  30.    catch (LoginException e)  
  31.    {  
  32.    }  
  33. }  
  34. }  




Java代码  收藏代码
  1. package com.sss;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.security.auth.callback.Callback;  
  6. import javax.security.auth.callback.CallbackHandler;  
  7. import javax.security.auth.callback.NameCallback;  
  8. import javax.security.auth.callback.PasswordCallback;  
  9. import javax.security.auth.callback.UnsupportedCallbackException;  
  10.   
  11. public class SimpleCallbackHandle implements CallbackHandler  
  12. {  
  13. public void handle(Callback[] callbacks) throws IOException,  
  14.     UnsupportedCallbackException  
  15. {  
  16.    for (Callback callback : callbacks)  
  17.    {  
  18.     if (callback instanceof NameCallback)  
  19.     {  
  20.      NameCallback nc = (NameCallback) callback;  
  21.      System.out.print(nc.getPrompt()+"1111");  
  22.      System.out.flush();  
  23.      nc.setName("dibin");  
  24. //     nc.setName((new BufferedReader(new InputStreamReader(  
  25. //         System.in))).readLine());  
  26.     }  
  27.     else if (callback instanceof PasswordCallback)  
  28.     {  
  29.      PasswordCallback pcb = (PasswordCallback) callback;  
  30.      System.out.print(pcb.getPrompt());  
  31.      System.out.flush();  
  32.       
  33.      pcb.setPassword(new char[]{'d','i','b','i','n'});  
  34. //     pcb.setPassword((new BufferedReader(new InputStreamReader(  
  35. //       System.in))).readLine().toCharArray());  
  36.     }  
  37.    }  
  38. }  
  39. }  




Java代码  收藏代码
  1. package com.sss;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Map;  
  5.   
  6. import javax.security.auth.Subject;  
  7. import javax.security.auth.callback.Callback;  
  8. import javax.security.auth.callback.CallbackHandler;  
  9. import javax.security.auth.callback.NameCallback;  
  10. import javax.security.auth.callback.PasswordCallback;  
  11. import javax.security.auth.callback.UnsupportedCallbackException;  
  12. import javax.security.auth.login.LoginException;  
  13. import javax.security.auth.spi.LoginModule;  
  14.   
  15. public class SimpleLoginModule implements LoginModule  
  16. {  
  17. private String userName;  
  18. private char[] password;  
  19. private Subject subject;  
  20. private CallbackHandler callbackHandler;  
  21. private Map sharedState;  
  22. private Map options;  
  23. private String debug;  
  24. public boolean abort() throws LoginException  
  25. {  
  26.    System.out.println("abort()");  
  27.    return false;  
  28. }  
  29. public boolean commit() throws LoginException  
  30. {  
  31.    System.out.println("commit()");  
  32.    return true;  
  33. }  
  34. public void initialize(Subject subject, CallbackHandler callbackHandler,  
  35.     Map sharedState, Map options)  
  36. {  
  37.    this.subject = subject;  
  38.    this.callbackHandler = callbackHandler;  
  39.    this.sharedState = sharedState;  
  40.    this.options = options;  
  41.    debug = (String) options.get("debug");  
  42. }  
  43. public boolean login() throws LoginException  
  44. {  
  45.     System.out.println("**********************");  
  46.    Callback[] callbacks = new Callback[2];  
  47.    callbacks[0] = new NameCallback("用户名: ");  
  48.    callbacks[1] = new PasswordCallback("密码: "false);  
  49.    try  
  50.    {  
  51.     callbackHandler.handle(callbacks);  
  52.     userName = ((NameCallback) callbacks[0]).getName();  
  53.     password = ((PasswordCallback) callbacks[1]).getPassword();  
  54.     if (debug.equals("true"))  
  55.     {  
  56.      System.out.println("你输入的用户名为:" + userName);  
  57.      System.out.println("你输入的密码为:" + new String(password));  
  58.     }  
  59.     if (userName.equals("dibin")  
  60.       && new String(password).equals("dibin"))  
  61.     {  
  62.      System.out.println("验证成功");  
  63.      return true;  
  64.     }  
  65.     else  
  66.     {  
  67.      System.out.println("验证失败");  
  68.      userName = null;  
  69.      password = null;  
  70.     }  
  71.    }  
  72.    catch (IOException e)  
  73.    {  
  74.     e.printStackTrace();  
  75.    }  
  76.    catch (UnsupportedCallbackException e)  
  77.    {  
  78.     e.printStackTrace();  
  79.    }  
  80.    return false;  
  81. }  
  82. public boolean logout() throws LoginException  
  83. {  
  84.    System.out.println("logout()");  
  85.    return false;  
  86. }  
  87. }  



Xml代码  收藏代码
  1. simple {     
  2.    com.sss.SimpleLoginModule required debug=true;     
  3. };  



Java代码  收藏代码
  1. package com.sss;  
  2.   
  3. import java.security.PrivilegedAction;  
  4. import java.security.PrivilegedActionException;  
  5.   
  6. public class MyPrivilege implements PrivilegedAction{  
  7.   
  8.     public Object run() {  
  9.         // TODO Auto-generated method stub  
  10.         System.out.println("this is  run  method");  
  11.         return null;  
  12.     }  
  13.   

原创粉丝点击