(轉(zhuǎn)載自 http://callan.javaeye.com/blog/158392 )
JAAS是對JCE安全框架的重要補(bǔ)充,通過提供認(rèn)證用戶和確定用戶授權(quán)來增強(qiáng)JAVA解決方案的動態(tài)安全性,使得資源能夠得到很好得到保護(hù)和控制(JAAS使用動態(tài)的安全策略來定義權(quán)限,而不是將其靜態(tài)的嵌入到代碼中)。
JAAS采用的是插件的運(yùn)行方式,一開始就被設(shè)計(jì)成可插拔的(Pluggable),根據(jù)應(yīng)用的需要,只要配置一下JAAS的配置文件,這些組件即可包含 在我們的應(yīng)用程序中。使用JAAS包接口,開發(fā)者和第三方可以開發(fā)一些組件或者BEAN來實(shí)現(xiàn)登陸認(rèn)證,或者通過與使用者或外部的系統(tǒng)的進(jìn)行交互來訪問認(rèn) 證信息(當(dāng)然我們可以設(shè)計(jì)更為穩(wěn)妥安全的密碼學(xué)協(xié)議)。JAAS提供了一組用于用戶鑒別的類和接口,這意味著支持JAAS的應(yīng)用會要求用戶登陸,同時 JAAS提供了另一組用于用戶授權(quán)的類和接口。在討論例子之前,先對JAAS API中常用的一些類和接口做個簡單的說明。
LoginModule :確認(rèn)用戶的合法性(使用CallbackHandler或者其他類方法),并分配訪問權(quán)限principal給subject;
LoginContext:為了實(shí)現(xiàn)用戶鑒別,建立相應(yīng)的環(huán)境,從配置文件中導(dǎo)入規(guī)則;
CallbackHandler:回調(diào)處理器,負(fù)責(zé)與用戶(代碼擁有者和執(zhí)行者)交互,確認(rèn)其身份的合法性;
Subject:表示登陸處理的目標(biāo),即一個被鑒別的用戶。并可關(guān)聯(lián)一個或多個pirncipal;
Principal:表示具有訪問權(quán)限的一個實(shí)體,可以看作是可以執(zhí)行某種操作的證件。
理解這些類和接口的關(guān)系我給個生動的比方:一個軍事學(xué)校,入學(xué)的時候校方(LoginModule)根據(jù)學(xué)生(Subject)的入學(xué)通知來確定其合法 性,這個過程交由某工作人員(CallbackHandler)執(zhí)行,(CallbackHandler)確認(rèn)后,(LoginModule)給不同 (Subject)根據(jù)其身份發(fā)給相關(guān)的證件(Principal),有了該證件就可以訪問對應(yīng)的資源,(Subject)根據(jù)自己的 (Principal)的級別可以使用和訪問學(xué)校不同資源。
一個(Subject)的(Principal)如果是士官級,那么可以訪問的資源就相對少些,如果是將軍級那就多些。當(dāng)然一個(Subject)可以擁有多個(Principal)。
通過分析我們會發(fā)現(xiàn),JAAS采用的也是身份檢查+權(quán)限分配模式。因此JAAS的應(yīng)用也分成兩個部分:(1)認(rèn)證;(2)授權(quán)。過程是先認(rèn)證后根據(jù)身份來授權(quán)(有歧視的嫌疑的東東,本人可是反歧視人士)。
那么JAAS是如何實(shí)現(xiàn)認(rèn)證的呢?又是如何實(shí)現(xiàn)授權(quán)的呢?且聽我慢慢分解,將其妙處展現(xiàn)給大家。
二 JAAS的認(rèn)證原理
(1) 設(shè)置JAAS配置文件,關(guān)于配置非常有技巧,跟設(shè)置防火墻的過濾規(guī)則有得一拼;
(2) 根據(jù)JAAS配置文件的條目加載一個或者多個LoginModule(通常一個,也可以變態(tài)得使用多個);
(3) 為了管理用戶認(rèn)證的有關(guān)過程,將提供一個可選的LoginModule構(gòu)造函數(shù)和一個回調(diào)處理器CallbackHandler。如果沒有在構(gòu)造函數(shù)中提供回調(diào)處理器,系統(tǒng)采用默認(rèn)設(shè)置;
(4) 初始并實(shí)例化LoginContext(加載配置規(guī)則),如果成功,則調(diào)用LoginContext的login方法。無論是否需 要,LoginContext都會去首先讀取JAAS配置文件,從中獲得要加載的登陸模塊信息,其initialize方法將按照配置文件中的相關(guān)內(nèi)容提 供LoginModule運(yùn)行所需要的信息;
(5) LoginContext的login方法將調(diào)用LoginModule的login方法,確定用戶身份。該方法將設(shè)置相關(guān)的回調(diào),并由回調(diào)處理器CallbackHandler來管理登陸處理回調(diào);
(6) LoginModule的login方法將負(fù)責(zé)與用戶進(jìn)行交互(可能是人機(jī)交互,也可能是機(jī)機(jī)交互),如果用戶輸入信息無效,則該方 法返回FALSE,一次交互過程結(jié)束,如果用戶輸入信息有效,則該方法將設(shè)置Principal對象的Subject對象,并返回TRUE;當(dāng)然 LoginModule也可以將與用戶之間的所有交互過程全部委托給處理器CallbackHandler來處理。如果登陸成功, LoginContext將調(diào)用LoginModule的commit方法將結(jié)果提交給LoginModule實(shí)例的內(nèi)部狀態(tài)。
在應(yīng)用程序中使用JAAS驗(yàn)證通常會涉及到以下幾個步驟:
1. 創(chuàng)建一個LoginContext的實(shí)例。
2. 為了能夠獲得和處理驗(yàn)證信息,將一個CallBackHandler對象作為參數(shù)傳送給LoginContext。
3. 通過調(diào)用LoginContext的login()方法來進(jìn)行驗(yàn)證。
4. 通過使用login()方法返回的Subject對象實(shí)現(xiàn)一些特殊的功能(假設(shè)登錄成功)。
下面是一個簡單的例子:
SimpleLogin.java

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

SimpleCallbackHandle.java

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

SimpleLoginModule.java

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

jaas.config
將代碼編輯通過后執(zhí)行以下命令:
java -Djava.security.auth.login.config==jaas.config com.SimpleLogin
源代碼