日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JAAS Authorization文档

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAAS Authorization文档 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本指南擴(kuò)展了在JAAS Authentication文檔中的程序和policy文件,展示了JAAS Authorization組件,這個(gè)組件確保被認(rèn)證的調(diào)用者對(duì)后續(xù)的安全敏感的操作有訪問(wèn)控制的權(quán)利(權(quán)限)。因?yàn)槭跈?quán)組件首先需要用戶(hù)認(rèn)證操作完成,請(qǐng)先閱讀JAAS Authentication的doc。

本教程剩下的部分包含目錄列出的內(nèi)容:

如果你想先看下教程代碼的運(yùn)行,你可以直接跳到運(yùn)行代碼的部分,然后再回來(lái)看其他的部分了解更多。

?

什么是JAAS Authorization?

JAAS授權(quán)擴(kuò)展了已經(jīng)存在的JAVA安全機(jī)構(gòu),已存在的安全架構(gòu)用一個(gè)策略文件來(lái)指定執(zhí)行的代碼被授予什么訪問(wèn)權(quán)限。在Java 2平臺(tái)中介紹的這個(gè)架構(gòu)是以代碼為中心的。也就是說(shuō),權(quán)限基于代碼的特性被授予:代碼從哪里來(lái),是否有數(shù)字簽名,如果有,是誰(shuí)簽的。我們?cè)贘AAS Authentication教程的jassacn.policy文件中看到的例子。這個(gè)文件包含下面的內(nèi)容:

[html] view plain copy
  • grant?codebase"file:./JaasAcn.jar"?{??
  • ??permission?javax.security.auth.AuthPermission??
  • ???????????????????"createLoginContext.JaasSample";??
  • };??
  • 授權(quán)JaasAcn.jar中的代碼指定的權(quán)限(沒(méi)有指定簽名者,所有代碼簽不簽名不重要)。

    JAAS授權(quán)增加新的用戶(hù)中心的訪問(wèn)權(quán)限到已存在的代碼中心的訪問(wèn)權(quán)限。權(quán)限的授予標(biāo)準(zhǔn)不僅基于什么代碼在運(yùn)行而且考慮到誰(shuí)在運(yùn)行它。

    當(dāng)一個(gè)應(yīng)用用JAAS認(rèn)證來(lái)認(rèn)證一個(gè)用戶(hù)(或者其他的實(shí)體,比如一個(gè)服務(wù)),一個(gè)Subject被創(chuàng)建作為結(jié)果。Subject的作用是代替被認(rèn)證的用戶(hù)。一個(gè)Subject由很多Principal組成,每一個(gè)Principal代表那個(gè)用戶(hù)的一個(gè)身份。例如。一個(gè)Subject可以有一個(gè)名字身份(“Susan Smith“)和一個(gè)社會(huì)安全號(hào)碼(”987-65-4321“),因此,可以區(qū)分于其他的Subject。

    權(quán)限可以被策略文件來(lái)授予給特定的Principal。在用戶(hù)被認(rèn)證后,應(yīng)用可以將一個(gè)Subject和當(dāng)前的訪問(wèn)控制環(huán)境聯(lián)系。對(duì)于后續(xù)的安全檢查操作,(例如,一個(gè)本地的文件訪問(wèn)),java運(yùn)行時(shí)環(huán)境將自動(dòng)判定策略是否授權(quán)給一個(gè)特定的Principal需要的權(quán)限,如果授權(quán)了,操作將被允許,只有在與Subject連接的訪問(wèn)控制上下文中包含指定的Principal。

    JAAS授權(quán)如何工作?

    一個(gè)授權(quán)操作,需要下面的步驟:

    1.??????用戶(hù)必須被認(rèn)證,就像在JAAS Authentication tutorial里描述的

    2.??????安全策略必須配置基于Principal的條目

    3.??????認(rèn)證的結(jié)果,Subject必須與當(dāng)前的訪問(wèn)控制環(huán)境連接。

    基于Principal的策略文件怎么寫(xiě)?

    策略文件的grant語(yǔ)句可以選擇性的包含一個(gè)或者多個(gè)Principal字段。Principal字段聲明用戶(hù)或者被特定Principal代表的其他實(shí)體,執(zhí)行特定的代碼,有指定的權(quán)限。

    因此,grant語(yǔ)句基本的格式是:

    [html] view plain copy
  • grant?<signer(s)?field>,?<codeBase?URL>???
  • ??<Principal?field(s)>?{??
  • ????permission?perm_class_name?"target_name",?"action";??
  • ????....??
  • ????permission?perm_class_name?"target_name",?"action";??
  • ??};??
  • 每一個(gè)簽名。CodeBase和Principal字段所在的位置是可選的,字段間的順序也不重要:

    一個(gè)Principal字段可以像下面這樣:

    也就是說(shuō),單詞Principal(位置不重要),緊跟著一個(gè)Principal類(lèi)和一個(gè)Principal的名字。

    一個(gè)Principal類(lèi)是一個(gè)實(shí)現(xiàn)了java.security.Principal接口的類(lèi)。所有的Principal對(duì)象有一個(gè)相關(guān)聯(lián)的名字,這個(gè)名字可以調(diào)用它的getName方法得到。名字所用的格式依賴(lài)于每一個(gè)Principal的實(shí)現(xiàn)。

    本教程中使用的Kerberos的認(rèn)證機(jī)制創(chuàng)建的Subject中的Principal的類(lèi)型是javax.security.auth.kerberos.KerberosPrincipal,也就是應(yīng)該被用作grant語(yǔ)句的Principal_class的部分。KerberosPrincipals?的用戶(hù)名是” name@realm “格式。所以,如果用戶(hù)名是mjones,Realm是KRBNT-OPS.ABC.COM,那么grant語(yǔ)句中使用的principal_name就是mjones@KRBNT-OPS.ABC.COM。

    在一個(gè)grant語(yǔ)句中可能包含多個(gè)Principal字段。如果多個(gè)Principal字段被指定,grant語(yǔ)句中的權(quán)限僅在Subject包含所有這些Principal時(shí)被授予。

    為了給不同的Principal授予同樣的權(quán)限,創(chuàng)建多個(gè)只包含一個(gè)Principal字段的grant語(yǔ)句。

    本教程的策略文件包含一個(gè)只有一個(gè)Principal字段的grant語(yǔ)句:

    [html] view plain copy
  • grant?codebase?"file:./SampleAction.jar",??
  • ????Principal?javax.security.auth.kerberos.KerberosPrincipal???
  • ????????"your_user_name@your_realm"??{??
  • ???
  • ???permission?java.util.PropertyPermission?"java.home",?"read";??
  • ???permission?java.util.PropertyPermission?"user.home",?"read";??
  • ???permission?java.io.FilePermission?"foo.txt",?"read";??
  • };??
  • ***各種***Permission

    將Kerberos的用戶(hù)名和Realm替換成你自己的。

    上邊的配置指出,顯式授予指定的Principal執(zhí)行SampleAction.jar中的代碼的權(quán)限。

    如果將一個(gè)Subject和訪問(wèn)控制上下文關(guān)聯(lián)?

    為了創(chuàng)建和用訪問(wèn)控制上下文關(guān)聯(lián)一個(gè)Subject,你需要下面的過(guò)程:

    1.??????用戶(hù)必須先被認(rèn)證,就是JAAS Authentication joc中描述的。

    2.??????Subject類(lèi)的靜態(tài)的doAs方法必須被調(diào)用,傳給其一個(gè)認(rèn)證了的Subject和一個(gè)java.security.PrivilegedAction或者java.security.PrivilegedExceptionAction。((See?API for PrivilegedBlocks?fora comparison of PrivilegedAction and PrivilegedExceptionAction.))。doAs方法用當(dāng)前的訪問(wèn)控制上下文關(guān)聯(lián)給定的Subject,然后調(diào)用Action的run方法。Run方法的實(shí)現(xiàn)包含作為指定的Subject,所有被執(zhí)行的代碼。這樣Action以特定的Subject執(zhí)行。

    Subject類(lèi)的靜態(tài)的doAsPrivileged?方法可以代替doAs方法被調(diào)用。除了傳給doAs方法的參數(shù)外,doAsPrivileged?需要第三個(gè)參數(shù):一個(gè)AccessControlContext對(duì)象。不想doAs方法,用當(dāng)前的訪問(wèn)控制上下文聯(lián)系Subject,方法doAsPrivileged?用給定的訪問(wèn)控制上下文聯(lián)系Subject。See?doAs vs. doAsPrivileged?in theJAAS Reference Guide for a comparison of those methods。

    授權(quán)教程代碼

    本教程的代碼包含兩個(gè)文件:

    1.??????JaasAzn.java除了Subject.doAsPrivileged調(diào)用中額外的代碼,與JAASAuthentication教程中的JaasAcn.java文件一樣。

    2.??????SampleAction.java包含SampleAction類(lèi)。這個(gè)類(lèi)實(shí)現(xiàn)了PrivilegedAction,有一個(gè)run方法,這個(gè)方法包含了所有我們想基于Principal認(rèn)證檢查執(zhí)行的代碼。

    JaasAzn.java

    JaasAzn.java與之前的教程中用的到JaasAcn.java完全一樣,除了在mian方法的在認(rèn)證完成后語(yǔ)句之后增加了3條語(yǔ)句。這些語(yǔ)句使一個(gè)帶表一個(gè)通過(guò)認(rèn)證的用戶(hù)的Subject與當(dāng)前訪問(wèn)控制上下文關(guān)聯(lián),然后執(zhí)行SampleAction的run方法中的一些代碼。用訪問(wèn)控制表關(guān)聯(lián)Subject使SampleAction的run方法中安全敏感的操作(任何run方法中直接或間接調(diào)用的代碼)在代表一個(gè)認(rèn)證的用戶(hù)的Principal被在當(dāng)前的策略中被授予必要的權(quán)限時(shí)被執(zhí)行。

    跟JaasAcn.java一樣,JaasAzn.java初始化一個(gè)LoginContext lc和調(diào)用它的login方法來(lái)執(zhí)行認(rèn)證。如果成功,被認(rèn)證的Subject(包含一個(gè)代表這個(gè)用戶(hù)的Principal)通過(guò)LoginContext的getSubject方法獲得。

    [html] view plain copy
  • Subject?mySubject?=?lc.getSubject();??
  • 然后,Main方法調(diào)用Subject.doAsPrivileged,將通過(guò)認(rèn)證的Subjectmysubject傳給它,一個(gè)PrivilegedAction(SampleAction)和一個(gè)null AccessControlContext,就像下邊的描述:

    SampleAction?通過(guò)下面的方式被初始化:

    [html] view plain copy
  • PrivilegedAction?action?=?new?SampleAction();??
  • Subject.doAsPrivileged?通過(guò)下面的方式被執(zhí)行:

    [html] view plain copy
  • Subject.doAsPrivileged(mySubject,?action,?null);??
  • doAsPrivileged?方法調(diào)用PrivilegedAction?action?(SampleAction)? 的run方法開(kāi)始執(zhí)行剩下的代碼,這些代碼被認(rèn)為是代表mySubject執(zhí)行。

    傳給doAsPrivileged?方法一個(gè)null作為第三個(gè)參數(shù)AccessControlContext?表明mySubject應(yīng)用與一個(gè)新的空的AccessControlContext關(guān)聯(lián)。這個(gè)結(jié)果是以mySubject運(yùn)行時(shí),發(fā)生在SampleAction執(zhí)行期間的安全檢查將只需要SampleAction自己的代碼(或者其他它調(diào)用的代碼)權(quán)限。注意,doAsPrivileged?的調(diào)用者在執(zhí)行期間不需要任何的權(quán)限。

    SampleAction.java

    SampleAction.java包含SampleAction類(lèi)。這個(gè)類(lèi)實(shí)現(xiàn)了java.security.PrivilegedAction,有一個(gè)包含所有mySubject想執(zhí)行的所有代碼。對(duì)于本教程,我們將做3個(gè)步驟,每一個(gè)步驟都只有在代碼被授予必要的權(quán)限的情況下才能做。我們將:

    1.??????讀和打印java.home系統(tǒng)屬性值

    2.??????讀和打印user.name的系統(tǒng)屬性值

    3.??????判斷foo.txt文件在當(dāng)前目錄是否存在

    這是代碼:

    [html] view plain copy
  • import?java.io.File;??
  • import?java.security.PrivilegedAction;??
  • ???
  • public?class?SampleAction?implements?PrivilegedAction?{??
  • ???
  • ??public?Object?run()?{??
  • ???
  • ????System.out.println("\nYour?java.home?property?value?is:?"??
  • ????????????????+?System.getProperty("java.home"));??
  • ???
  • ????System.out.println("\nYour?user.home?property?value?is:?"??
  • ????????????????+?System.getProperty("user.home"));??
  • ???
  • ????File?f?=?new?File("foo.txt");??
  • ????System.out.print("\nfoo.txt?does?");??
  • ????if?(!f.exists())??
  • ????????System.out.print("not?");??
  • ????System.out.println("exist?in?the?current?working?directory.");??
  • ????return?null;??
  • ??}??
  • }??
  • 登錄配置文件

    本教程使用的登錄配置文件與在JAAS Authentication教程中使用的完全一樣。因此,我們可以用jaas.conf文件,文件僅包含一個(gè)條目:

    [html] view plain copy
  • JaasSample?{??
  • ??com.sun.security.auth.module.Krb5LoginModule?required;??
  • };??
  • 這個(gè)條目被命名為“JaasSample”,也就是我們的教程的應(yīng)用程序JaasAcn和JaasAzn應(yīng)用的名字。這個(gè)條目指定了用來(lái)做認(rèn)證的LoginModule?是com.sun.security.auth.module包中的Krb5LoginModule?,為了使認(rèn)證被認(rèn)為是成功的,Krb5LoginModule需?要“succeed”。 Krb5LoginModule只有在用戶(hù)提供的用戶(hù)名和密碼成功的登錄到Kerberos KDC時(shí)才成功。

    策略文件

    授權(quán)教程保羅兩個(gè)類(lèi),JaasAzn和SampleAction。每個(gè)類(lèi)中的代碼包含一些安全敏感的操作,因此,相關(guān)的權(quán)限需要在一個(gè)策略文件中被執(zhí)行,以使操作被允許執(zhí)行。

    JaasAzn需要的權(quán)限

    JaasAzn類(lèi)的main方法做了兩個(gè)操作需要權(quán)限的操作:

    1.??????創(chuàng)建了一個(gè)LoginContext

    2.??????調(diào)用Subject類(lèi)的doAsPrivileged?靜態(tài)方法

    LoginContext的創(chuàng)建與認(rèn)證教程中的方式一樣,因此,它需要與createLoginContext.JaasSample相同的權(quán)限javax.security.auth.AuthPermission

    為了調(diào)用Subject類(lèi)的doAsPrivileged?方法,你需要對(duì)doAsPrivileged有一個(gè)javax.security.auth.AuthPermission對(duì)象。

    假設(shè)JaasAzn類(lèi)被放到j(luò)aasAzn.jar文件中,這些權(quán)限需要通過(guò)策略文件中配置grant語(yǔ)句來(lái)授權(quán):

    [html] view plain copy
  • grant?codebase?"file:./JaasAzn.jar"?{??
  • ???permission?javax.security.auth.AuthPermission???
  • ????????????????????"createLoginContext.JaasSample";??
  • ???permission?javax.security.auth.AuthPermission?"doAsPrivileged";??
  • };??
  • SampleAction需要的權(quán)限

    SampleAction代碼做了3個(gè)需要權(quán)限的操作:

    1.??????讀取java.home系統(tǒng)屬性

    2.??????讀取user.home系統(tǒng)屬性

    3.??????檢查當(dāng)前文件中是否有foo.txt的文件

    這些操作需要的權(quán)限如下:

    [html] view plain copy
  • permission?java.util.PropertyPermission?"java.home",?"read";??
  • permission?java.util.PropertyPermission?"user.home",?"read";??
  • permission?java.io.FilePermission?"foo.txt",?"read";??
  • 我們需要給中的SampleAction.class代碼授予權(quán)限,我們將吧SampleAction.class放到SampleAction.jar文件中。然而,對(duì)于這個(gè)特定的grant語(yǔ)句,我們希望不僅授權(quán)給代碼,而且授權(quán)給執(zhí)行代碼的特定的用戶(hù),來(lái)指定如何限制一個(gè)特定用戶(hù)的訪問(wèn)權(quán)限。

    因此,就像在中?How Do You Make Principal-BasedPolicy File Statements?,描述的,我們的grant語(yǔ)句看起來(lái)像下面這樣:

    [html] view plain copy
  • grant?codebase?"file:./SampleAction.jar",??
  • ????Principal?javax.security.auth.kerberos.KerberosPrincipal???
  • ????????"your_user_name@your_realm"??{??
  • ???
  • ???permission?java.util.PropertyPermission?"java.home",?"read";??
  • ???permission?java.util.PropertyPermission?"user.home",?"read";??
  • ???permission?java.io.FilePermission?"foo.txt",?"read";??
  • };??
  • 用你的Kerberos用戶(hù)名和Realm代替。例如,如果你的用戶(hù)名是“mjones”,Realm是“KRBNT-OPERATIONS.ABC.COM”。你將用mjones@KRBNT-OPERATIONS.ABC.COM。

    策略文件的全部?jī)?nèi)容

    [html] view plain copy
  • /**?Java?2?Access?Control?Policy?for?the?JaasAzn?Application?**/??
  • ???
  • ???
  • /**?Code-Based?Access?Control?Policy?for?JaasAzn?**/??
  • ???
  • grant?codebase?"file:./JaasAzn.jar"?{??
  • ???
  • ???permission?javax.security.auth.AuthPermission???
  • ????????????????????"createLoginContext.JaasSample";??
  • ???permission?javax.security.auth.AuthPermission?"doAsPrivileged";??
  • };??
  • ???
  • ???
  • /**?User-Based?Access?Control?Policy?for?the?SampleAction?class??
  • ?**?instantiated?by?JaasAzn???
  • ?**/??
  • ???
  • grant????codebase?"file:./SampleAction.jar",??
  • ????Principal?javax.security.auth.kerberos.KerberosPrincipal???
  • ????????"your_user_name@your_realm"??{??
  • ???
  • ???permission?java.util.PropertyPermission?"java.home",?"read";??
  • ???permission?java.util.PropertyPermission?"user.home",?"read";??
  • ???permission?java.io.FilePermission?"foo.txt",?"read";??
  • };??
  • 運(yùn)行授權(quán)教程的代碼

    為了執(zhí)行我們的JAAS授權(quán)教程代碼,所有你需要做的是:

    1.??????將下面的文件到一個(gè)文件夾

    ·????????The?JaasAzn.java?sourcefile.

    ·????????The?SampleAction.java?sourcefile.

    ·????????The?jaas.conf?loginconfiguration file.

    ·????????The?jaasazn.policy?policyfile.

    2.????Replace "your_user_name@your_realm"in?jaasazn.policy?with youruser name and realm.

    3.????Compile?SampleAction.java?and?JaasAzn.java:

    javac SampleAction.java JaasAzn.java

    4.????Create a JAR file named?JaasAzn.jar?containing?JaasAzn.class:

    [html] view plain copy
  • jar?-cvf?JaasAzn.jar?JaasAzn.class??
  • 5.????Create a JAR file named?SampleAction.jar?containing?SampleAction.class:

    [html] view plain copy
  • jar?-cvf?SampleAction.jar?SampleAction.class??
  • 6.????Execute the?JaasAzn?application,specifying

    1.????by anappropriate?-classpath?clause that classes should be searched for intheJaasAzn.jar?and?SampleAction.jar?JAR files,

    2.????by?-Djava.security.manager?thata security manager should be installed,

    3.????by?-Djava.security.krb5.realm=<your_realm>?thatyour Kerberos realm is the one specified.

    4.????by?-Djava.security.krb5.kdc=<your_kdc>?thatyour Kerberos KDC is the one specified.

    5.????by?-Djava.security.policy=jaasazn.policy?thatthe policy file to be used isjaasazn.policy, and

    6.????by?-Djava.security.auth.login.config=jaas.conf?thatthe login configuration file to be used is?jaas.conf.

    下面是Windows下全部的命令:

    [html] view plain copy
  • java?-classpath?JaasAzn.jar;SampleAction.jar???
  • ?-Djava.security.manager???
  • ?-Djava.security.krb5.realm=<your_realm>???
  • ?-Djava.security.krb5.kdc=<your_kdc>???
  • ?-Djava.security.policy=jaasazn.policy???
  • ?-Djava.security.auth.login.config=jaas.conf?JaasAzn??
  • 這是UNIX下全部的命令

    [html] view plain copy
  • java?-classpath?JaasAzn.jar:SampleAction.jar???
  • ?-Djava.security.manager???
  • ?-Djava.security.krb5.realm=<your_realm>???
  • ?-Djava.security.krb5.kdc=<your_kdc>???
  • ?-Djava.security.policy=jaasazn.policy???
  • ?-Djava.security.auth.login.config=jaas.conf?JaasAzn??
  • 將這些命令放到一行里。

    你將被提示輸入Kerberos的用戶(hù)名和密碼,指定在登錄配置文件中的底層的Kerberos認(rèn)證機(jī)制將登錄到Kerberos。如果你的登錄成功,你講看到Authenticationsucceeded!信息,如果不是,你將看到AuthenticationFailed。

    一旦認(rèn)證成功,程序剩下的部分(SampleAction)將代表你這個(gè)用戶(hù)執(zhí)行,需要你已經(jīng)被授權(quán)合適的權(quán)限。Jassazn.policy策略文件將授權(quán)給你必要的權(quán)限,所以你將看到java.home?and?user.home和你的當(dāng)前文件夾是否有一個(gè)名叫foo.txt的文件的值被顯示。

    總結(jié)

    以上是生活随笔為你收集整理的JAAS Authorization文档的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。