JavaRush /Java Blog /Random-TK /JAAS - Tehnologiýa giriş (1-nji bölüm)
Viacheslav
Dereje

JAAS - Tehnologiýa giriş (1-nji bölüm)

Toparda çap edildi
Giriş howpsuzlygy Java-da uzak wagt bäri amala aşyrylýar we bu howpsuzlygy üpjün etmek üçin arhitektura JAAS - Java tanamak we awtorizasiýa hyzmaty diýilýär. Bu syn, tassyklamagyň, awtorizasiýanyň nämedigini we JAAS-yň näme bilen baglanyşyklydygynyň syryny açmaga synanyşar. JAAS Servlet API bilen nädip dost we gatnaşyklarynda kynçylyk çekýän ýerleri.
JAAS - Tehnologiýa giriş (1-nji bölüm) - 1

Giriş

Bu synda web programma howpsuzlygy ýaly mowzugy ara alyp maslahatlaşmak isleýärin. Java-da howpsuzlygy üpjün edýän birnäçe tehnologiýa bar: Todayöne bu günki söhbetdeşligimiz “Java autentifikasiýa we awtorizasiýa hyzmaty (JAAS)” diýilýän başga bir tehnologiýa barada bolar. Hakyky tassyklamak we ygtyýarnama ýaly möhüm zatlary suratlandyrýan aýal. Geliň, has jikme-jik seredeliň.
JAAS - Tehnologiýa giriş (1-nji bölüm) - 2

JAAS

JAAS Java SE-iň giňelmesi bolup, Java tanamak we awtorizasiýa hyzmaty (JAAS) salgylanma gollanmasynda düşündirilýär . Tehnologiýanyň adyndan görnüşi ýaly, JAAS tassyklamanyň we ygtyýarnamanyň nädip ýerine ýetirilmelidigini düşündirýär:
  • " Autentifikasiýa ": Grek dilinden terjime edilen "authentikos" "hakyky, hakyky" diýmekdir. Autagny, autentifikasiýa hakykylygyň synagydyr. Kim tassyklanan bolsa, hakykatdanam kimdigini aýdýar.

  • " Awtorizasiýa ": iňlis dilinden terjime edilen "rugsat" diýmekdir. Successfulagny, awtorizasiýa üstünlikli tanamakdan soň ýerine ýetirilen giriş gözegçiligi.

JAagny, JAAS çeşmä elýeterliligi kimiň soraýandygyny kesgitlemek we bu ygtyýary alyp biljekdigi barada karar bermek. Durmuşdan kiçijik bir meňzeşlik: ýolda sürýärsiňiz we bir inspektor sizi saklaýar. Resminamalary bermegiňizi haýyş edýäris. Resminamalar bilen awtoulag sürüp bilersiňizmi? Ora-da meselem, dükanda spirt satyn almak isleýärsiňiz. Ilki bilen pasport - tassyklamak soralýar. Ondan soň, ýaşyňyza görä, alkogol satyn almaga hukugyňyz barmy diýen karara gelindi. Bu awtorizasiýa. Web programmalarynda ulanyjy hökmünde girmek (ulanyjy adyny we paroly girizmek) tassyklamakdyr. Haýsy sahypalary açyp boljakdygyny kesgitlemek ygtyýarnama bilen kesgitlenýär. Bu ýerde “Java tanamak we awtorizasiýa hyzmaty (JAAS)” bize kömek edýär. JAAS göz öňünde tutulanda, JAAS-yň beýan edýän birnäçe esasy düşünjesine düşünmek möhümdir: Mowzuk, prinsipler, şahsyýetnamalar. Subýekt tassyklamak temasy. .Agny, hukuklaryň eýesi ýa-da eýesi. Resminamalarda Subýekt haýsydyr bir hereketi ýerine ýetirmek haýyşynyň çeşmesi hökmünde kesgitlenýär. Mowzuk ýa-da çeşme haýsydyr bir görnüşde beýan edilmelidir we bu maksat bilen prinsip ulanylýar, rus dilinde käwagt prinsip hem diýilýär. .Agny, her bir müdir belli bir nukdaýnazardan bir predmetiň wekili. Has düşnükli etmek üçin bir mysal getireliň: Belli bir adam mowzuk. Aşakdakylar prinsip hökmünde çykyş edip bilerler:
  • ýol ulanyjysy hökmünde adamyň wekili hökmünde sürüjilik şahadatnamasy
  • pasporty, ýurduň raýaty hökmünde adamyň wekili hökmünde
  • daşary ýurt pasporty, halkara gatnaşyklaryna gatnaşyjy hökmünde adamyň wekili hökmünde
  • kitaphanadaky okyjy hökmünde adamyň şekili hökmünde kitaphanadaky kitaphana kartasy
Mundan başga-da, Subýektiň iňlis dilinde “şahsyýet” manysyny berýän “Ygtyýarnama” toplumy bar. Ine, Subýekt özüniň bardygyny tassyklaýar. Mysal üçin, ulanyjynyň paroly Ygtyýarnama bolup biler. Ora-da ulanyjynyň hakykatdanam özüniň bardygyny tassyklap biljek islendik obýekt. Indi JAAS-yň web programmalarynda nähili ulanylýandygyny göreliň.
JAAS - Tehnologiýa giriş (1-nji bölüm) - 3

Web programmasy

Şeýlelikde, bize web programmasy gerek. Gradle awtomatiki taslama gurmak ulgamy ony döretmäge kömek eder. “Gradle” -iň ulanylmagy sebäpli, kiçijik buýruklary ýerine ýetirip, Java taslamasyny zerur formatda ýygnap bileris, zerur katalog gurluşyny awtomatiki döredip bileris we başga-da köp zatlary edip bileris. Gradle hakda has gysgaça maglumat: " Gradle bilen gysgaça tanyşlyk " ýa-da " Gradle Starting " resmi resminamalarynda okap bilersiňiz . Taslamany başlamalydyrys (Başlangyç) we bu maksat bilen Gradle-de ýörite bir plugin bar: “ Gradle Init Plugin ” (Init Başlamak üçin gysga, ýatda saklamak aňsat). Bu plagini ulanmak üçin buýruk setirinde buýrugy işlediň:
gradle init --type java-application
Üstünlikli tamamlanandan soň, Java taslamamyz bolar. Indi redaktirlemek üçin taslamamyzyň gurluş skriptini açalyň. build.gradleGurluş skripti , programma gurluşynyň nuanslaryny beýan edýän faýl . Şonuň üçin ady, skript guruň. Munuň taslama gurmak ssenarisidigini aýdyp bileris. Gradle şeýle köpugurly gural, esasy mümkinçilikleri pluginler bilen giňeldilýär. Şonuň üçin ilki bilen “pluginler” blokyna üns bereliň:
plugins {
    id 'java'
    id 'application'
}
Düzgüne görä, Gradle, "" kesgitlän zadymyza laýyklykda --type java-application, käbir esasy pluginleriň toplumyny, ýagny Gradle-iň paýlanyşyna goşulan şol pluginleriň toplumyny döretdi. Gradle.org web sahypasyndaky "Resminamalar" (ýagny resminamalar) bölümine girseňiz , çep tarapda "Salgy" bölümindäki mowzuklaryň sanawynda " Esasy plaginler " bölümini görýäris, ýagny. bu gaty esasy pluginleriň beýany bilen bölüm. Gradleň biziň üçin döredenlerini däl-de, bize gerekli pluginleri saýlalyň. Resminamalara görä, " Gradle Java Plugin " deslapky kody düzmek ýaly Java kody bilen esasy amallary üpjün edýär. Şeýle hem, resminamalara laýyklykda, " Gradle programma plugin " bize "ýerine ýetirip bolýan JVM programmasy" bilen işlemek üçin gurallar bilen üpjün edýär. özbaşdak programma hökmünde işe girizilip bilinjek java programmasy bilen (mysal üçin, konsol programmasy ýa-da öz UI programmasy). Görnüşi ýaly, bize "programma" plugin gerek däl, sebäbi ... özbaşdak programma gerek däl, web programmasy gerek. Öçüreliň. Diňe şu plugin bilen belli bolan “mainClassName” sazlamasy. Mundan başga-da, Programma Plugin resminamalaryna baglanyşyk berlen şol bir " Gaplamak we paýlamak " bölüminde Gradle War Plugin-e baglanyşyk bar. Gradle War Plugin , resminamalarda görkezilişi ýaly, söweş web görnüşinde Java web programmalaryny döretmäge goldaw berýär. WAR formatynda JAR arhiwiniň ýerine WAR arhiwi dörediljekdigini aňladýar. Bu bize gerek zat ýaly. Şeýle hem, resminamalarda aýdylyşy ýaly "Uruş plugin Java pluginini giňeldýär". .Agny, java pluginini uruş plagini bilen çalşyp bileris. Şonuň üçin plugin blokymyz ahyrsoňy şeýle bolar:
plugins {
    id 'war'
}
Şeýle hem "Gradle War Plugin" resminamalarynda pluginiň goşmaça "Taslama düzülişi" ulanylýandygy aýdylýar. Layout iňlis dilinden ýerleşýän ýeri hökmünde terjime edilýär. .Agny, uruş plagini, öz wezipeleri üçin ulanjak faýllaryň belli bir ýeriniň bolmagyna garaşýar. Web programma faýllaryny saklamak üçin aşakdaky katalogy ulanar: src/main/webapp Plaginiň özüni alyp barşy şeýle düşündirilýär:
JAAS - Tehnologiýa giriş (1-nji bölüm) - 4
.Agny, web programmamyzyň WAR arhiwini guranda, plugin bu ýerden faýllary göz öňünde tutar. Mundan başga-da, Gradle War Plugin resminamalarynda bu bukjanyň "arhiwiň kökü" boljakdygy aýdylýar. Onda eýýäm WEB-INF katalogyny döredip we web.xml faýly goşup bileris. Bu haýsy faýl? web.xml- bu "Gurnama beýan ediji" ýa-da "ýerleşdiriş beýany". Bu, web programmamyzyň işlemegi üçin nädip sazlamalydygyny görkezýän faýl. Bu faýl, programmamyzyň haýsy haýyşlary ýerine ýetirjekdigini, howpsuzlyk sazlamalaryny we başga-da köp zady kesgitleýär. Esasy, JAR faýlyndaky aç-açan faýla birneme meňzeýär (" Manifest faýllary bilen işlemek: esaslar "). “Manifest” faýly Java programmasy (ýagny JAR arhiwi) bilen nädip işlemelidigini, web.xml bolsa Java Web Programmasy (ýagny WAR arhiwi) bilen nädip işlemelidigini aýdýar. "Gurnama beýan ediji" düşünjesi öz-özünden ýüze çykmady, ýöne " Servlet API spesifikasiýasy" resminamasynda beýan edilýär.Islendik Java web programmasy bu "Servlet API" -e baglydyr. Munuň API bolandygyna düşünmek möhümdir, ýagny käbir özara baglanyşyk şertnamasynyň beýany. Web programmalary garaşsyz programmalar däl. Web serwerinde işleýär , ulanyjylar bilen tor aragatnaşygyny üpjün edýär. webagny, web serweri web programmalary üçin bir "konteýner". Bu mantykly, sebäbi web programmasynyň logikasyny ýazmak isleýäris, ýagny ulanyjynyň haýsy sahypalary görjekdigini we nädip ulanyjynyň hereketlerine reaksiýa bildirmeli. We ulanyja habaryň nädip iberiljekdigi, baýtlaryň nädip geçiriljekdigi we beýleki pes derejeli we gaty hil talap edýän zatlar üçin kod ýazmak islemeýäris. Mundan başga-da web programmalarynyň hemmesiniň üýtgeşikdigi ýüze çykýar, ýöne maglumat geçirmek birmeňzeş. millionagny, bir million programmist şol bir maksat üçin kod ýazmaly bolýardy. Şonuň üçin web serweri ulanyjylaryň käbiriniň özara gatnaşygy üçin jogapkärdir. we maglumat alyş-çalşygy, web programmasy we dörediji şol maglumatlary döretmek üçin jogapkärdir. Bu iki bölegi birleşdirmek üçin, ýagny web serweri we web programmasy, olaryň özara gatnaşygy üçin şertnama gerek, ýagny muny etmek üçin haýsy düzgünleri berjaý ederler? Şertnamany, web programmasy bilen web serweriniň arasyndaky täsiriň nähili bolmalydygyny düşündirmek üçin Servlet API oýlanyp tapyldy. Gyzykly tarapy, Bahar ýaly çarçuwalary ulansaňyzam, kapotyň aşagynda işleýän Servlet API bar. Springagny, Bahary ulanýarsyňyz, Bahar bolsa Servlet API bilen işleýär. Netijede, web programma taslamamyz Servlet API-e bagly bolmaly. Bu ýagdaýda Servlet API garaşlylyk bolar. Bilşimiz ýaly, Gradle size taslama baglylyklaryny deklaratiw görnüşde suratlandyrmaga mümkinçilik berýär. Pluginler garaşlylygy nädip dolandyryp boljakdygyny düşündirýärler. Mysal üçin, Java Gradle Plugin "testImplementation" garaşlylygy dolandyryş usuly bilen tanyşdyrýar, bu garaşlylygyň diňe synaglar üçin zerurdygyny aýdýar. Emma “Gradle War Plugin” garaşlylygy dolandyrmak usulyny “üpjün edilenCompile” goşýar, bu garaşlylygyň web programmamyzyň WAR arhiwine goşulmajakdygyny aýdýar. Näme üçin Servlet API-ni WAR arhiwimize goşmaýarys? Sebäbi Servlet API web programmamyza web serweriniň özi tarapyndan üpjün ediler. Web serwer Servlet API bilen üpjün edýän bolsa, serwere servlet konteýner diýilýär. Şol sebäpden, Servlet API bilen üpjün etmek web serweriniň jogapkärçiligidir we ServletAPI-i diňe kod düzülen wagtynda üpjün etmek biziň jogapkärçiligimizdir. Şonuň üçin providedCompile. Şeýlelik bilen, garaşlylyk bloky şeýle bolar:
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testImplementation 'junit:junit:4.12'
}
Şeýlelik bilen, web.xml faýlyna gaýdyp geleliň. Düzgüne görä, Gradle hiç hili ýerleşdiriş beýany döredenok, şonuň üçin muny özümiz etmeli. Geliň src/main/webapp/WEB-INF, bir katalog döredeliň we onda XML faýly dörederis web.xml. Indi "Java Servlet Spesifikasiýasynyň" özi we " 14-nji BAP ýerleşdiriş beýany " bölümini açalyň . "14.3 ýerleşdiriş beýany" -da aýdylyşy ýaly, ýerleşdiriş beýanynyň XML resminamasy http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd shema bilen düşündirilýär . XML shemasy resminamanyň haýsy elementlerden ybarat bolup biljekdigini we haýsy tertipde peýda bolmalydygyny görkezýär. Haýsylary hökmany we haýsylary ýok. Umuman, resminamanyň gurluşyny suratlandyrýar we XML resminamasynyň dogry düzülendigini barlamaga mümkinçilik berýär. Indi " 14.5 Mysallar " bölüminden mysal alalyň , ýöne shema 3.1 wersiýasy üçin görkezilmelidir.
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
Boşlarymyz web.xmlşeýle bolar:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <display-name>JAAS Example</display-name>
</web-app>
Indi JAAS ulanyp gorajak serwletimizi suratlandyralyň. Ozal Gradle biziň üçin “App” synpyny döredýärdi. Geliň, ony serwete öwüreliň. " 2-nji BAP Serwet interfeýsi " -niň spesifikasiýasynda aýdylyşy ýaly , " Köp maksat bilen döredijiler öz hyzmatlaryny amala aşyrmak üçin HttpServlet-i giňelderler ", ýagny synpy servlet etmek üçin şu synpdan miras almalysyňyz HttpServlet:
public class App extends HttpServlet {
	public String getGreeting() {
        return "Secret!";
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print(getGreeting());
    }
}
Aýdyşymyz ýaly, Servlet API serwer bilen web programmamyzyň arasyndaky şertnama. Bu şertnama, ulanyjy serwer bilen habarlaşanda, serwer ulanyjydan obýekt görnüşinde haýyş döredip, HttpServletRequestony serwete geçirjekdigini düşündirmäge mümkinçilik berýär. HttpServletResponseŞeýle hem , serwlet ulanyjy üçin oňa jogap ýazyp biler ýaly bir hyzmat bilen üpjün eder . Serwlet işlemegi gutarandan soň, serwer ulanyja esaslanan jogap berip biler HttpServletResponse. Servagny, servlet ulanyjy bilen gönüden-göni aragatnaşyk saklamaýar, diňe serwer bilen aragatnaşyk saklaýar. Serwerimiziň serwletimiziň bardygyny we haýsy haýyşlary ulanmalydygyny bilmek üçin ýerleşdiriş beýanynda serwere bu barada aýtmalydyrys:
<servlet>
	<servlet-name>app</servlet-name>
	<servlet-class>jaas.App</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>app</servlet-name>
	<url-pattern>/secret</url-pattern>
</servlet-mapping>
Bu ýagdaýda, ähli haýyşlar synpa laýyk gelýän /secretbir hyzmatçy adymyza iberilmez . Öň hem aýdyşymyz ýaly, web programmasy diňe web serwerinde ýerleşdirilip bilner. Web serweri aýratyn gurup bolýar (özbaşdak). Thisöne bu gözden geçirmek üçin alternatiw wariant amatly - içerki serwerde işlemek. Bu, serweriň programma taýdan dörediljekdigini we işe giriziljekdigini aňladýar (plugin muny biziň üçin eder) we şol bir wagtyň özünde web programmamyz hem ýerleşdiriler. Gradle gurmak ulgamy " Gradle Gretty Plugin " pluginini şu maksatlar üçin ulanmaga mümkinçilik berýär :appjaas.App
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Mundan başga-da, Gretty plugininiň gowy resminamalary bar . “Gretty” plugininiň dürli web serwerleriniň arasynda geçmäge mümkinçilik berýändiginden başlalyň. Bu resminamalarda has jikme-jik düşündirilýär: " Serwet gaplaryň arasynda geçmek ". Tomkata geçeliň, sebäbi ... ulanylyşynda iň meşhurlaryndan biri, şeýle hem gowy resminamalary we köp mysallary we analiz edilen meseleleri bar:
gretty {
    // Переключаемся с дефолтного Jetty на Tomcat
    servletContainer = 'tomcat8'
    // Укажем Context Path, он же Context Root
    contextPath = '/jaas'
}
Indi "gradle appRun" işledip bileris, soňra web programmamyz http: // localhost: 8080 / jaas / secret
JAAS - Tehnologiýa giriş (1-nji bölüm) - 5
Serwet konteýneriniň Tomcat tarapyndan saýlanandygyny barlamak (# 1 serediň) we web programmamyzyň haýsy salgysynyň bardygyny barlamak möhümdir (22 serediň).
JAAS - Tehnologiýa giriş (1-nji bölüm) - 6

Hakyky tanamak

Hakyky tanamak sazlamalary köplenç iki bölekden durýar: serwer tarapyndaky sazlamalar we bu serwerde işleýän web programmasynyň tarapyndaky sazlamalar. Web programmasynyň howpsuzlyk sazlamalary, web programmasy web serweri bilen täsirleşip bilmeýän başga bir sebäp bolmasa, web serweriniň howpsuzlyk sazlamalary bilen täsirleşip bilmeýär. Tomkata geçendigimiz biderek däldi, sebäbi ... Tomkatyň gowy beýan edilen arhitekturasy bar (" Apache Tomcat 8 Arhitektura " serediň). Bu arhitekturanyň beýanyndan Tomkatyň web serweri hökmünde web programmasyny “ Tomcat konteksti ” diýlip atlandyrylýan belli bir kontekst hökmünde görkezýändigi aýdyňdyr. Bu kontekst, her bir web programmasynyň beýleki web programmalaryndan üzňeleşdirilen öz sazlamalaryna eýe bolmagyna mümkinçilik berýär. Mundan başga-da, web programmasy bu kontekstiň sazlamalaryna täsir edip biler. Çeýe we amatly. Has çuňňur düşünmek üçin " Tomcat kontekst konteýnerlerine düşünmek " makalasyny we Tomkat resminamalar bölümini " Kontekst konteýner " okamagy maslahat berýäris. Aboveokarda aýdylyşy ýaly, web programmamyz, a ulanyp, programmamyzyň Tomcat kontekstine täsir edip biler /META-INF/context.xml. We täsir edip biljek iň möhüm sazlamalarymyzyň biri Howpsuzlyk ýerleri. Howpsuzlyk ýerleri “howpsuzlyk sebiti”. Belli bir howpsuzlyk sazlamalary görkezilen ýer. Şoňa laýyklykda Howpsuzlyk Realm ulanylanda bu Realm üçin kesgitlenen howpsuzlyk sazlamalaryny ulanýarys. Howpsuzlyk ýerleri konteýner tarapyndan dolandyrylýar. web programmamyz däl, web serweri. Programmamyza haýsy howpsuzlyk çäginiň giňeldilmelidigini diňe serwere aýdyp bileris. " Realm komponenti " bölümindäki Tomkat resminamalary, Realm-y ulanyjylar we autentifikasiýany ýerine ýetirmekdäki rollary baradaky maglumatlary ýygnaýar. Tomcat, “ Jaas Realm ” atly dürli Howpsuzlyk Realm ýerine ýetiriş toplumyny hödürleýär . Biraz terminologiýa düşünenimizden soň, faýldaky Tomkat kontekstini suratlandyralyň /META-INF/context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Realm className="org.apache.catalina.realm.JAASRealm"
           appName="JaasLogin"
           userClassNames="jaas.login.UserPrincipal"
           roleClassNames="jaas.login.RolePrincipal"
           configFile="jaas.config" />
</Context>
appName- anketanyň ady. Tomcat bu ady görkezilen atlar bilen deňeşdirmäge synanyşar configFile. configFile- bu "giriş konfigurasiýa faýly". Muňa mysal JAAS resminamalarynda görmek bolýar: " Goşundy B: Mysal üçin giriş konfigurasiýalary ". Mundan başga-da, bu faýlyň ilki çeşmelerde gözlenmegi möhümdir. Şonuň üçin web programmamyz bu faýly özi üpjün edip biler. Sypatlar userClassNameswe roleClassNamesulanyjynyň direktoryny görkezýän synplary görkezýär. JAAS "ulanyjy" we "rol" düşünjelerini iki dürli manyda bölýär java.security.Principal. Aboveokardaky synplary suratlandyralyň. Ulanyjy direktory üçin iň ýönekeý durmuşa geçiriş döredeliň:
public class UserPrincipal implements Principal {
    private String name;
    public UserPrincipal(String name) {
        this.name = name;
    }
    @Override
    public String getName() {
        return name;
    }
}
Edil şol bir ýerine ýetirişi takyk gaýtalarys RolePrincipal. Interfeýsden görnüşi ýaly, direktor üçin esasy zat, direktoryň adyny görkezýän käbir ady (ýa-da şahsyýetnamany) saklamak we yzyna gaýtarmak. Indi, Howpsuzlyk meýdany bar, esasy synplarymyz bar. Faýly " configFile" atributyndan doldurmak galýar, aka login configuration file. Onuň düşündirişini Tomkat resminamalarynda tapyp bilersiňiz: " Realm komponenti ".
JAAS - Tehnologiýa giriş (1-nji bölüm) - 7
.Agny, JAAS Login Config sazlamasyny web programmamyzyň çeşmelerine ýerleşdirip bileris we Tomcat Context-iň kömegi bilen ulanyp bileris. Bu faýl ClassLoader üçin çeşme hökmünde elýeterli bolmaly, şonuň üçinem onuň ýoly şeýle bolmaly: \src\main\resources\jaas.config Geliň, bu faýlyň mazmunyny belläliň:
JaasLogin {
    jaas.login.JaasLoginModule required debug=true;
};
context.xmlŞol bir atyň şu ýerde we içinde ulanylýandygyny bellemelidiris . Bu, Howpsuzlyk ýerini LoginModule kartalaşdyrýar. Şeýlelikde, Tomkat Kontekst haýsy synplaryň direktorlary aňladýandygyny, şeýle hem LoginModule ulanmalydygyny aýtdy. Biziň etmeli zadymyz, bu LoginModule durmuşa geçirmek. LoginModule , JAAS-da iň gyzykly zatlaryň biridir. Resmi resminamalar LoginModule: " Java tanamak we awtorizasiýa hyzmaty (JAAS): LoginModule dörediji gollanma " -ny ösdürmäge kömek eder . Giriş modulyny durmuşa geçireliň. Interfeýsi amala aşyrýan synp döredeliň LoginModule:
public class JaasLoginModule implements LoginModule {
}
Ilki bilen başlangyç usulyny suratlandyrýarys LoginModule:
private CallbackHandler handler;
private Subject subject;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler, <String, ?> sharedState, Map<String, ?> options) {
	handler = callbackHandler;
	this.subject = subject;
}
Bu usul tygşytlar Subject, mundan beýläk tassyklap, direktorlar hakda maglumatlary doldurarys. CallbackHandlerŞeýle hem , bize berlen geljekde ulanmak üçin tygşytlarys . Kömek bilen, CallbackHandlerbiraz soň tanamaklyk temasy barada dürli maglumatlary sorap bileris. Bu hakda has giňişleýin CallbackHandlerresminamalaryň degişli bölüminde okap bilersiňiz: " JAAS salgylanma gollanmasy: CallbackHandler ". loginOndan soň tanamak usuly ýerine ýetirilýär Subject. Bu tassyklamagyň birinji tapgyry:
@Override
public boolean login() throws LoginException {
	// Добавляем колбэки
	Callback[] callbacks = new Callback[2];
	callbacks[0] = new NameCallback("login");
	callbacks[1] = new PasswordCallback("password", true);
	// При помощи колбэков получаем через CallbackHandler логин и пароль
	try {
		handler.handle(callbacks);
		String name = ((NameCallback) callbacks[0]).getName();
		String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
		// Далее выполняем валидацию.
		// Тут просто для примера проверяем определённые значения
		if (name != null && name.equals("user123") && password != null && password.equals("pass123")) {
			// Сохраняем информацию, которая будет использована в методе commit
			// Не "пачкаем" Subject, т.к. не факт, что commit выполнится
			// Для примера проставим группы вручную, "хардcodeно".
			login = name;
			userGroups = new ArrayList<String>();
			userGroups.add("admin");
			return true;
		} else {
			throw new LoginException("Authentication failed");
		}
	} catch (IOException | UnsupportedCallbackException e) {
		throw new LoginException(e.getMessage());
	}
}
loginÜýtgetmeli däldiris Subject. Şeýle üýtgeşmeler diňe tassyklama usulynda bolup geçmeli commit. Ondan soň, üstünlikli tassyklamany tassyklamagyň usulyny beýan etmeli:
@Override
public boolean commit() throws LoginException {
	userPrincipal = new UserPrincipal(login);
	subject.getPrincipals().add(userPrincipal);
	if (userGroups != null && userGroups.size() > 0) {
		for (String groupName : userGroups) {
			rolePrincipal = new RolePrincipal(groupName);
			subject.getPrincipals().add(rolePrincipal);
		}
	}
	return true;
}
Usuly aýyrmak geň bolup biler loginwe commit. Theöne esasy zat, giriş modullaryny birleşdirip bolar. Üstünlikli tassyklamak üçin birnäçe giriş modullarynyň üstünlikli işlemegi zerur bolup biler. Diňe ähli zerur modullar işlän bolsa, üýtgeşmeleri saklaň. Bu tassyklamagyň ikinji tapgyry. Geliň, usullary abortwe usullary bilen gutaralyň logout:
@Override
public boolean abort() throws LoginException {
	return false;
}
@Override
public boolean logout() throws LoginException {
	subject.getPrincipals().remove(userPrincipal);
	subject.getPrincipals().remove(rolePrincipal);
	return true;
}
Usul aborttassyklamagyň birinji tapgyry şowsuz bolanda çagyrylýar. Usul logoutulgamdan çykanda diýilýär. Özümizi durmuşa geçirip Login Module, ony düzenimizden soň, indi belli birini ulanmak isleýändigimizi Security Realmgörkezmeli : web.xmlLogin Config
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>JaasLogin</realm-name>
</login-config>
Howpsuzlyk meýdanymyzyň adyny kesgitledik we tanamak usulyny - BASIC kesgitledik. Bu, " 13.6 Autentifikasiýa " bölüminde Servlet API-de beýan edilen tanamaklygyň görnüşlerinden biridir . Galan n
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION