jass登录认证

一 什么是JAAS

Java 认证和授权服务”(Java Authentication and Authorization Service,JAAS)是对 Java 2 SDK 的扩展。

JAAS 可分Authentication和Authorization 。

1)  Authentication:认证用户身份。看哪个用户在执行代码。通俗的来说就是哪个用户在执行操作。这个操作可能在某个application或bean或servlet上.

2) Authorization : 授权用户操作。也就是验证用户是否对指定资源有特定访问权限。好比某一用户是否有对指定文件的读取权限。



二 常用接口

CallbackHandler:用去用户信息,用于验证用户身份。

LoginModule:用于验证用户信息。

只是一个通过配置的或传参的两个对象的组合应用

回调是你调用我,传入你,我用传入的你调你



三 简单Demo

MyCallbackHandler.java



Java代码 复制代码 收藏代码
package authentication; 
import java.io.BufferedReader; 
import java.io.IOException; 
4.import java.io.InputStreamReader; 
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 MyCallbackHandler implements CallbackHandler { 
12. 
13.    @Override 
14.    public void handle(Callback[] callbacks) throws IOException, 
15.            UnsupportedCallbackException { 
16.        for(Callback callback:callbacks){ 
17.             
18.            if(callback instanceof NameCallback){ 
19.                NameCallback nameCallback=(NameCallback)callback; 
20.                 
21.                String prompt=nameCallback.getPrompt(); 
22.                 
23.                System.err.print(prompt); 
24.                 
25.                nameCallback.setName(new BufferedReader(new InputStreamReader(System.in)).readLine()); 
26.            } 
27.             
28.            if(callback instanceof PasswordCallback){ 
29.                PasswordCallback passwordCallback=(PasswordCallback)callback; 
30.                 
31.                String prompt=passwordCallback.getPrompt(); 
32.                 
33.                System.err.print(prompt); 
34.                 
35.                passwordCallback.setPassword(new BufferedReader(new InputStreamReader(System.in)).readLine().toCharArray()); 
36.            } 
37.        } 
38. 
39.    } 
40.} 




SampleLoginModule.java



Java代码 复制代码 收藏代码
1.package authentication; 
2.import java.util.Map; 
3.import javax.security.auth.Subject; 
4.import javax.security.auth.callback.Callback; 
5.import javax.security.auth.callback.CallbackHandler; 
6.import javax.security.auth.callback.NameCallback; 
7.import javax.security.auth.callback.PasswordCallback; 
8.import javax.security.auth.login.LoginException; 
9.import javax.security.auth.spi.LoginModule; 
10.public class SampleLoginModule implements LoginModule { 
11. 
12.    // initial state 
13.    private Subject subject; 
14.    private CallbackHandler callbackHandler; 
15.    private Map sharedState; 
16.    private Map options; 
17. 
18.    // configurable option 
19.    private boolean debug = false; 
20. 
21.    // username and password 
22.    private String username; 
23.    private char[] password; 
24. 
25.    public void initialize(Subject subject, CallbackHandler callbackHandler, 
26.            Map sharedState, Map options) { 
27.  
28.    this.subject = subject; 
29.    this.callbackHandler = callbackHandler; 
30.    this.sharedState = sharedState; 
31.    this.options = options; 
32. 
33.    // initialize any configured options 
34.    debug = "true".equalsIgnoreCase((String)options.get("debug")); 
35.    } 
36. 
37.    public boolean login() throws LoginException { 
38.        Callback[] callbacks = new Callback[2]; 
39.        callbacks[0] = new NameCallback("user name: "); 
40.        callbacks[1] = new PasswordCallback("password: ", false); 
41.      
42.        try { 
43.            callbackHandler.handle(callbacks); 
44.        } catch (Exception e) { 
45.            throw new RuntimeException(e); 
46.        } 
47.        username = ((NameCallback)callbacks[0]).getName(); 
48.        password = ((PasswordCallback)callbacks[1]).getPassword(); 
49.        
50.        if("admin".equals(username)&&"admin".equals(new String(password))){ 
51.            return true; 
52.        } 
53.         
54.        return false; 
55. 
56.    } 
57. 
58.    public boolean commit() throws LoginException { 
59.        System.out.println(" =========== commit =========="); 
60.        return true; 
61.    } 
62. 
63.    
64.    public boolean abort() throws LoginException { 
65.        System.out.println(" =========== abort =========="); 
66.        return true; 
67.    } 
68. 
69. 
70.    @Override 
71.    public boolean logout() throws LoginException { 
72.        System.out.println(" =========== logout =========="); 
73.        return true; 
74.    } 
75. 
76.    
77.} 




SampleAcn.java



Java代码 复制代码 收藏代码
1.package authentication; 
2.import javax.security.auth.login.LoginContext; 
3.public class SampleAcn { 
4.    public static void main(String[] args) throws Exception { 
5.        LoginContext lc = new LoginContext("sample",new MyCallbackHandler()); 
6.         
7.        lc.login(); 
8.    } 
9.} 




sample_jaas.config



Config代码 复制代码 收藏代码
1.sample { 
2.   authentication.SampleLoginModule required debug=true; 
3.}; 




要设置的系统参数 -Djava.security.auth.login.config==src/authentication/sample_jaas.config



Demo认证执行流程:



Java代码 复制代码 收藏代码
1.LoginContext lc = new LoginContext("sample",new MyCallbackHandler()); 


构造LoginContext



Java代码 复制代码 收藏代码
1.lc.login(); 


执行认证。因为系统参数设置

-Djava.security.auth.login.config==src/authentication/sample_jaas.config

所以认证配置文件是sample_jaas.config。因为构造LoginContext的时候传入的第一个参数是"sample".

所以在sample_jaas.config中查找名为sample的配置段。及



Config代码 复制代码 收藏代码
1.sample { 
2.   authentication.SampleLoginModule required debug=true; 
3.}; 


authentication.SampleLoginModule为指定的LoginModule实现。

因为构造LoginContext的时候传入的第二个参数是new MyCallbackHandler。所以MyCallbackHandler用于获取用户认证信息。

所以:在执行lc.login()时,会调用SampleLoginModule的login方法。而SampleLoginModule会通过MyCallbackHandler获取用户的认证信息。如果认证成功则返回true,否则返回false.


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—



你可能感兴趣的:(登录,认证,jass)