JavaRush /Блоги Java /Random-TG /JAAS - Муқаддима ба технология (Қисми 1)
Viacheslav
Сатҳи

JAAS - Муқаддима ба технология (Қисми 1)

Дар гурӯҳ нашр шудааст
Амнияти дастрасӣ дар Java муддати тӯлонӣ амалӣ карда мешавад ва меъмории таъмини ин амният JAAS - Java Authentication and Authorization Service ном дорад. Ин барраси кӯшиш хоҳад кард, ки сирри аутентификатсия, авторизатсия чист ва JAAS ба он чӣ иртибот дорад, ифшо кунад. Чӣ тавр JAAS бо API Servlet дӯст аст ва дар куҷо онҳо дар муносибатҳои худ мушкилот доранд.
JAAS - Муқаддима ба технология (қисми 1) - 1

Муқаддима

Дар ин барраси ман мехоҳам як мавзӯъро ба монанди амнияти барномаҳои веб баррасӣ кунам. Java дорои якчанд технологияҳое мебошад, ки амниятро таъмин мекунанд:
  • " Java SE Platform Security Architecture ", тафсилоти бештарро дар дастури Oracle хондан мумкин аст: " JavaTM SE Platform Security Architecture ". Ин меъморӣ тавсиф мекунад, ки чӣ гуна мо бояд барномаҳои Java-и худро дар муҳити кории Java SE муҳофизат кунем. Аммо ин мавзуи сухбати имрузаи мо нест.

  • " Архитектураи криптографияи Java " як тавсеаи Java мебошад, ки рамзгузории маълумотро тавсиф мекунад. Шумо метавонед маълумоти бештарро дар бораи ин васеъшавӣ дар JavaRush дар барраси " Java Cryptography Architecture: Аввалин шиносоӣ " ё дар Роҳнамои Oracle: " Дастури истинод ба Java Cryptography Architecture (JCA) " хонед.

Аммо сӯҳбати имрӯзаи мо дар бораи технологияи дигаре хоҳад буд, ки "Java Authentication and Authorization Service (JAAS)" ном дорад. Маҳз вай чизҳои муҳимро ба монанди аутентификатсия ва иҷозатро тавсиф мекунад. Биёед инро муфассалтар дида бароем.
JAAS - Муқаддима ба технология (қисми 1) - 2

ЯАС

JAAS як тавсеаи Java SE мебошад ва дар дастури истинодҳои Java Authentication and Authorization Service (JAAS) тавсиф шудааст . Тавре ки аз номи технология бармеояд, JAAS тавсиф мекунад, ки чӣ гуна аутентификатсия ва авторизатсия бояд иҷро карда шавад:
  • " Аттентификатсия ": Тарҷума аз юнонӣ, "authentikos" маънои "воқеӣ, ҳақиқӣ" аст. Яъне, аснодишиносӣ санҷиши аслият аст. Ҳар касе, ки тасдиқ карда мешавад, воқеан ҳамон касест, ки онҳо мегӯянд.

  • " Authorизатсия ": аз забони англисӣ тарҷумашуда маънои "иҷозат"-ро дорад. Яъне, авторизатсия назорати дастрасӣ аст, ки пас аз тасдиқи бомуваффақият анҷом дода мешавад.

Яъне, JAAS дар бораи муайян кардани он, ки кӣ дастрасӣ ба манбаро дархост мекунад ва қарор қабул мекунад, ки оё ӯ ин дастрасӣ ба даст оварда метавонад ё не. Як қиёси хурде аз зиндагӣ: шумо дар роҳ ҳаракат мекунед ва нозир шуморо боздоштааст. Лутфан ҳуҷҷатҳоро пешниҳод кунед - аутентификатсия. Оё шумо метавонед мошинро бо ҳуҷҷатҳо идора кунед - иҷозат. Ё, масалан, шумо мехоҳед, ки дар мағоза машрубот харед. Аввалан, аз шумо шиноснома талаб карда мешавад - аутентификатсия. Баъдан, вобаста ба синну соли шумо қарор дода мешавад, ки оё шумо ҳуқуқи харидани машруботро доред. Ин иҷозат аст. Дар барномаҳои веб ворид шудан ба сифати корбар (вориди номи корбар ва парол) тасдиқи аутентификатсия аст. Ва муайян кардани кадом саҳифаҳое, ки шумо метавонед кушоед, аз ҷониби иҷозат муайян карда мешавад. Дар ин ҷо "Хадамоти аутентификатсия ва авторизатсияи Java (JAAS)" ба мо кӯмак мекунад. Ҳангоми баррасии JAAS, фаҳмидани якчанд мафҳумҳои калидӣ, ки JAAS тавсиф мекунад, муҳим аст: Мавзӯъ, Принсипҳо, Маълумотнома. Мавзӯъ мавзӯи аутентификатсия мебошад. Яъне баранда ё дорандаи ҳуқуқ аст. Дар ҳуҷҷатҳо, Субъект ҳамчун манбаи дархост барои иҷрои ягон амал муайян карда мешавад. Мавзӯъ ё манбаъ бояд ба гунае тавсиф карда шавад ва бо ин мақсад Принсипал истифода мешавад, ки дар забони русӣ онро баъзан асоснок низ меноманд. Яъне, ҳар як Принсипал аз нуқтаи назари муайян намояндагии субъект аст. Барои равшантар шудани он мисол меорем: Шахси муайян Субъект аст. Ва инҳо метавонанд ҳамчун Роҳбар баромад кунанд:
  • шањодатномаи ронандагии ў њамчун намояндагии шахс ба сифати истифодабарандаи роњ
  • шиносномаи ӯ, ҳамчун намояндагии шахс ҳамчун шаҳрванди кишвари худ
  • паспорти хоричии у, хамчун намояндагии шахе хамчун иштирокчии муносибатхои байналхалкй
  • корти китобхонаи худро дар китобхона, ҳамчун намояндагии шахс ҳамчун хонандаи ба китобхона пайваст
Илова бар ин, Субъект дорои маҷмӯи "Эътимоднома", ки маънои "шахсият" дар забони англисӣ дорад. Ҳамин тавр Субъект тасдиқ мекунад, ки ӯ ӯ аст. Масалан, пароли корбар метавонад Маълумотнома бошад. Ё ягон an objectе, ки корбар метавонад тасдиқ кунад, ки ӯ воқеан ӯ аст. Биёед ҳоло бубинем, ки чӣ тавр JAAS дар барномаҳои веб истифода мешавад.
JAAS — Мукаддима ба технология (кисми 1) — 3

Барномаи веб

Ҳамин тавр, ба мо як барномаи веб лозим аст. Системаи худкори лоиҳаи Gradle ба мо дар эҷоди он кӯмак мекунад. Ба шарофати истифодаи Gradle, мо метавонем бо иҷрои фармонҳои хурд лоиҳаи Java-ро дар формате, ки ба мо лозим аст, ҷамъ оварем, ба таври худкор сохтори директорияи заруриро эҷод кунем ва ғайра. Шумо метавонед бештар дар бораи Gradle дар шарҳи мухтасар хонед: " Муқаддимаи мухтасар ба Gradle " ё дар ҳуҷҷатҳои расмии " Gradle Getting Started ". Мо бояд лоиҳаро оғоз кунем (Initialization) ва барои ин Gradle дорои плагини махсус аст: “ Gradle Init Plugin ” (Init барои Initialization кӯтоҳ аст, ба осонӣ дар хотир нигоҳ дошта мешавад). Барои истифодаи ин плагин, фармонро дар сатри фармон иҷро кунед:
gradle init --type java-application
Пас аз анҷоми бомуваффақият, мо лоиҳаи Java дорем. Биёед ҳоло скрипти сохтани лоиҳаи худро барои таҳрир кушоем. Скрипти сохтмон ин файлест build.gradle, ки , ки нозукиҳои сохтани барномаро тавсиф мекунад. Аз ин рӯ, ном, сохтани скрипт. Мо гуфта метавонем, ки ин як скрипти сохтани лоиҳа аст. Gradle як асбоби гуногунҷабҳаест, ки қобorятҳои асосии он бо плагинҳо васеъ карда мешаванд. Аз ин рӯ, пеш аз ҳама, биёед ба блоки "плагинҳо" диққат диҳем:
plugins {
    id 'java'
    id 'application'
}
Ба таври нобаёнӣ, Gradle мувофиқи он чизе, ки мо нишон додем " --type java-application", маҷмӯи баъзе плагинҳои аслӣ, яъне он плагинҳоро, ки ба тақсимоти худи Gradle дохил карда шудаанд, насб кардааст. Агар шумо ба бахши "Ҳуҷҷатҳо" (яъне ҳуҷҷатҳо) дар вебсайти gradle.org равед, пас дар тарафи чап дар рӯйхати мавзӯъҳо дар бахши "Реферат" мо бахши " Plugins Core " -ро мебинем, яъне. бахш бо тавсифи ин плагинҳои хеле асосӣ. Биёед маҳз плагинҳоеро, ки ба мо лозиманд, интихоб кунем, на онҳое, ки Gradle барои мо тавлид кардааст. Тибқи ҳуҷҷатҳо, " Gradle Java Plugin " амалиёти асосиро бо codeи Java, ба монанди тартиб додани codeи сарчашма таъмин мекунад. Инчунин, тибқи ҳуҷҷатҳо, " Васлкунаки замимаи Gradle " ба мо асбобҳоро барои кор бо "барномаи иҷрошавандаи JVM" медиҳад, яъне. бо замимаи java, ки метавонад ҳамчун як барномаи мустақил оғоз шавад (масалан, барномаи консолӣ ё барнома бо интерфейси худ). Маълум мешавад, ки ба мо плагини "ариза" лозим нест, зеро... ба мо як барномаи мустақил лозим нест, ба мо як барномаи веб лозим аст. Биёед онро нест кунем. Инчунин танзимоти "mainClassName", ки танҳо ба ин плагин маълум аст. Ғайр аз он, дар ҳамон бахши " Бастабандӣ ва тақсимот ", ки дар он истинод ба ҳуҷҷатҳои Plugin Application пешниҳод шудааст, истиноди Васлкунаки Gradle War мавҷуд аст. Gradle War Plugin , тавре ки дар ҳуҷҷатҳо гуфта шудааст, барои эҷоди веб-барномаҳои Java дар формати ҷанг дастгирӣ мекунад. Дар формати WAR маънои онро дорад, ки ба ҷои бойгонии JAR, бойгонии WAR сохта мешавад. Чунин ба назар мерасад, ки ин ба мо лозим аст. Инчунин, тавре ки дар ҳуҷҷатҳо гуфта мешавад, "Васлкунаки Ҷанг плагини Java-ро васеъ мекунад". Яъне мо метавонем плагини java-ро бо плагини ҷанг иваз кунем. Аз ин рӯ, блоки плагини мо дар ниҳоят чунин хоҳад буд:
plugins {
    id 'war'
}
Инчунин дар ҳуҷҷатҳои "Plugin War Gradle" гуфта мешавад, ки плагин иловагии "Layout Project" -ро истифода мебарад. Тарҳ аз забони англисӣ ҳамчун ҷойгиршавӣ тарҷума шудааст. Яъне, плагини ҷангӣ ба таври нобаёнӣ мавҷудияти макони муайяни файлҳоро интизор аст, ки он барои вазифаҳои худ истифода хоҳад кард. Он директорияи зеринро барои нигоҳ доштани файлҳои замимаи веб истифода мебарад: src/main/webapp Рафтори плагин ба таври зерин тавсиф карда мешавад:
JAAS — Мукаддима ба технология (кисми 1) — 4
Яъне, плагин ҳангоми сохтани бойгонии WAR-и веб-барномаи мо файлҳои ин маконро ба назар мегирад. Илова бар ин, ҳуҷҷатҳои Gradle War Plugin мегӯяд, ки ин директория "решаи бойгонӣ" хоҳад буд. Ва аллакай дар он мо метавонем директорияи WEB-INF эҷод кунем ва дар он ҷо файли web.xml -ро илова кунем. Ин чӣ гуна файл аст? web.xml- ин "Тасвиркунандаи густариш" ё "тасвиркунандаи густариш" аст. Ин файлест, ки чӣ гуна танзим кардани барномаи веби моро барои кор тавсиф мекунад. Ин файл муайян мекунад, ки кадом дархостҳоро барномаи мо иҷро мекунад, танзимоти амниятӣ ва ғайра. Дар асл, он то андозае ба файли манифести файли JAR шабоҳат дорад (ниг. " Кор бо файлҳои манифест: Асосҳо "). Файли Манифест мегӯяд, ки чӣ тавр кор кардан бо Замимаи Java (яъне бойгонии JAR) ва web.xml чӣ гуна кор кардан бо Web Application Java (яъне бойгонии WAR) мегӯяд. Худи мафҳуми "Тасвиркунандаи ҷойгиркунӣ" худ аз худ ба вуҷуд наомадааст, балки дар ҳуҷҷати " Sertvlet API Specification" тавсиф шудааст.". Ҳар як веб-барномаи Java аз ин "Servlet API" вобаста аст. Фаҳмидани он муҳим аст, ки ин API аст, яъне тавсифи баъзе шартномаҳои мутақобила аст. Барномаҳои веб барномаҳои мустақил нестанд. Онҳо дар serverи веб кор мекунанд. , ки иртиботи шабакавиро бо корбарон таъмин мекунад.Яъне веб-server як навъ “контейнер” барои замимаҳои веб аст.Ин мантиқист, зеро мо мехоҳем мантиқи барномаи вебро нависем, яъне корбар кадом саҳифаҳоро мебинад ва чӣ тавр онҳо бояд ба амали корбар вокуниш нишон диҳанд.Ва мо намехоҳем code нависем, ки паём ба корбар чӣ гуна фиристода мешавад, byteҳои иттилоот чӣ гуна интиқол дода мешаванд ва дигар чизҳои сатҳи паст ва хеле сифатталаб. Маълум мешавад, ки замимаҳои веб ҳама гуногунанд, аммо интиқоли додаҳо як аст.Яъне як миллион барномасоз бояд барои як мақсад такрор ба такрор code нависад.Бинобар ин веб-server барои баъзе муоширати корбарон масъул аст. ва мубодилаи маълумот ва веб-барнома ва таҳиякунанда барои тавлиди ин маълумот масъуланд. Ва барои пайваст кардани ин ду қисм, яъне. веб-server ва веб-барнома, ба шумо барои ҳамкории онҳо шартнома лозим аст, яъне. барои ин кор кадом қоидаҳоро риоя мекунанд? Бо мақсади тавсифи шартнома, ки ҳамкории байни замимаи веб ва serverи веб чӣ гуна бояд бошад, API Servlet ихтироъ карда шуд. Ҷолиб он аст, ки ҳатто агар шумо чаҳорчӯбаҳоро ба мисли Spring истифода баред, то ҳол дар зери сарпӯши Сервлет API кор мекунад. Яъне шумо Spring-ро истифода мебаред ва Spring барои шумо бо API Servlet кор мекунад. Маълум мешавад, ки лоиҳаи веб-барномаи мо бояд аз API Servlet вобаста бошад. Дар ин ҳолат, API Servlet вобастагӣ хоҳад буд. Тавре ки мо медонем, Gradle инчунин ба шумо имкон медиҳад, ки вобастагии лоиҳаро ба таври декларативӣ тавсиф кунед. Плагинҳо тавсиф мекунанд, ки чӣ гуна вобастагиҳоро идора кардан мумкин аст. Масалан, Java Gradle Plugin усули идоракунии вобастагии "testImplementation" -ро ҷорӣ мекунад, ки мегӯяд, ки чунин вобастагӣ танҳо барои санҷишҳо лозим аст. Аммо Васлкунаки Gradle War як усули идоракунии вобастагӣ "providedCompile" -ро илова мекунад, ки мегӯяд, ки чунин вобастагӣ ба бойгонии WAR замимаи веби мо дохил карда намешавад. Чаро мо API Servlet-ро ба бойгонии WAR-и худ дохил намекунем? Азбаски Сервлет API ба замимаи веби мо аз ҷониби худи web server пешниҳод карда мешавад. Агар веб-server API-и Сервлетро таъмин кунад, пас server контейнери сервлет номида мешавад. Аз ин рӯ, масъулияти веб-server аст, ки ба мо API-и Сервлетро пешниҳод кунад ва мо масъулияти ServletAPI-ро танҳо ҳангоми тартиб додани code таъмин кунем. Барои ҳамон providedCompile. Ҳамин тариқ, блоки вобастагӣ чунин хоҳад буд:
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testImplementation 'junit:junit:4.12'
}
Пас, биёед ба файли web.xml баргардем. Бо нобаёнӣ, Gradle ягон Дескриптори ҷойгиркунӣ эҷод намекунад, аз ин рӯ мо бояд худамон ин корро кунем. Биёед директория эҷод кунем src/main/webapp/WEB-INFва дар он мо файли XML бо номи web.xml. Акнун биёед худи "Special Specification Java Servlet" ва боби " CHAPTER 14 Deskriptor Deployment " -ро кушоем. Тавре ки дар "14.3 Дескриптори ҷойгиркунӣ" гуфта шудааст, ҳуҷҷати XML Дескриптори Дескриптор бо схемаи http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd тавсиф карда мешавад . Схемаи XML тавсиф мекунад, ки ҳуҷҷат аз кадом унсурҳо иборат буда метавонад ва бо кадом тартиб онҳо бояд пайдо шаванд. Кадомаш ҳатмист ва кадомаш не. Дар маҷмӯъ, он сохтори ҳуҷҷатро тавсиф мекунад ва ба шумо имкон медиҳад, ки дуруст тартиб дода шудани ҳуҷҷати XML-ро тафтиш кунед. Акнун биёед мисолро аз боби " 14.5 Мисолҳо " истифода барем, аммо схема бояд барои versionи 3.1 муайян карда шавад, яъне.
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
Нусхаи холии мо web.xmlчунин хоҳад буд:
<?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>
Биёед ҳоло сервлетро тавсиф кунем, ки мо бо истифода аз JAAS муҳофизат мекунем. Қаблан, Gradle барои мо синфи App тавлид мекард. Биёед онро ба сервлет табдил диҳем. Тавре ки дар мушаххасоти " БОБИ 2 Интерфейси Сервлет " омадааст, ки " Барои аксари мақсадҳо, таҳиягарон HttpServlet-ро барои татбиқи сервлетҳои худ васеъ хоҳанд кард ", яъне барои сервлет табдил додани синф, шумо бояд ин синфро аз: мерос гиред 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());
    }
}
Тавре ки мо гуфта будем, API Servlet шартномаи байни server ва замимаи веби мост. Ин шартнома ба мо имкон медиҳад тавсиф кунем, ки вақте корбар бо server тамос мегирад, server дархости корбарро дар шакли an object тавлид мекунад HttpServletRequestва онро ба сервлет интиқол медиҳад. Он инчунин сервлетро бо an object таъмин мекунад HttpServletResponse, то сервлет метавонад ба он барои корбар посух нависад. Пас аз ба итмом расидани кор кардани сервлет, server метавонад ба корбар дар асоси он посух диҳад HttpServletResponse. Яъне сервлет мустақиман бо корбар не, балки танҳо бо server муошират мекунад. Барои он ки server бидонад, ки мо сервлет дорем ва барои кадом дархостҳо он бояд истифода шавад, мо бояд ба server дар ин бора дар дескриптори ҷойгиркунӣ нақл кунем:
<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>
Дар ин ҳолат, ҳама дархостҳо ба як сервлети мо бо номе , ки ба синф мувофиқ аст, /secretирсол карда намешаванд . Тавре ки мо қаблан гуфта будем, як барномаи веб метавонад танҳо дар serverи веб ҷойгир карда шавад. Веб-serverро алоҳида насб кардан мумкин аст (мустақил). Аммо барои мақсадҳои ин барраси, як варианти алтернативӣ мувофиқ аст - кор дар serverи дарунсохт. Ин маънои онро дорад, ки server ба таври барномавӣ сохта ва ба кор андохта мешавад (плагин ин корро барои мо мекунад) ва ҳамзамон веб-барномаи мо дар он ҷойгир карда мешавад. Системаи сохтани Gradle ба шумо имкон медиҳад, ки плагини " Gradle Gretty Plugin "-ро барои ин мақсадҳо истифода баред: appjaas.App
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Илова бар ин, плагини Gretty дорои ҳуҷҷатҳои хуб аст . Биёед бо он оғоз кунем, ки плагини Gretty ба шумо имкон медиҳад, ки байни serverҳои гуногуни веб гузаред. Ин дар ҳуҷҷатҳо муфассалтар тасвир шудааст: " Гузариш байни контейнерҳои сервлет ". Биёед ба Tomcat гузарем, зеро ... он яке аз маъмултарин дар истифода буда, инчунин дорои ҳуҷҷатҳои хуб ва мисолҳои зиёд ва мушкилоти таҳлилшуда мебошад:
gretty {
    // Переключаемся с дефолтного Jetty на Tomcat
    servletContainer = 'tomcat8'
    // Укажем Context Path, он же Context Root
    contextPath = '/jaas'
}
Акнун мо метавонем "gradle appRun" -ро иҷро кунем ва он гоҳ барномаи веби мо дар http://localhost:8080/jaas/secret дастрас хоҳад шуд.
JAAS — Мукаддима ба технология (кисми 1) — 5
Муҳим аст, ки санҷед, ки контейнери сервлет аз ҷониби Tomcat интихоб шудааст (ниг. №1) ва санҷед, ки дар кадом суроғаи веб-барномаи мо дастрас аст (ниг. №2).
JAAS - Муқаддима ба технология (қисми 1) - 6

Аутентификатсия

Танзимоти аутентификатсия одатан аз ду қисм иборат аст: танзимот дар тарафи server ва танзимот дар паҳлӯи замимаи веб, ки дар ин server кор мекунад. Танзимоти амниятии веб-барнома наметавонад бо танзимоти амниятии веб-server мутақобила кунад, агар бо ягон сабабе ғайр аз ин, барномаи веб наметавонад бо serverи веб ҳамкорӣ кунад. Беҳуда мо ба Tomcat гузаштем, зеро... Tomcat меъмории хуб тавсифшуда дорад (ниг. " Apache Tomcat 8 Architecture "). Аз тавсифи ин меъморӣ маълум аст, ки Tomcat ҳамчун веб-server, веб-барномаро ҳамчун контексти муайян муаррифӣ мекунад, ки онро " Tomcat Context " меноманд. Ин контекст имкон медиҳад, ки ҳар як замимаи веб танзимоти худро дошта бошад, ки аз дигар замимаҳои веб ҷудо карда шудааст. Илова бар ин, барномаи веб метавонад ба танзимоти ин контекст таъсир расонад. Фасеҳ ва қулай. Барои фаҳмиши амиқтар, мо тавсия медиҳем, ки мақолаи " Фаҳмидани контейнерҳои контекстии Tomcat " ва бахши ҳуҷҷатҳои Tomcat " Контейнери контекст " -ро хонед. Тавре ки дар боло гуфта шуд, веб-барномаи мо метавонад бо истифода аз /META-INF/context.xml. Ва яке аз танзимоти муҳиме, ки мо метавонем ба он таъсир кунем, Realms Security мебошад. Realms Security як навъ "минтақаи амният" аст. Майдоне, ки барои он танзимоти махсуси амниятӣ муайян карда шудаанд. Мутаносибан, ҳангоми истифодаи минтақаи Амният, мо танзимоти амниятие, ки барои ин минтақа муайян шудааст, истифода мебарем. Realms Security аз ҷониби контейнер идора карда мешавад, яъне. serverи веб, на веб-барномаи мо. Мо танҳо метавонем ба server бигӯем, ки кадом доираи амният бояд ба замимаи мо васеъ карда шавад. Ҳуҷҷатҳои Tomcat дар бахши " Ҷузъи Realm " Realm-ро ҳамчун маҷмӯи маълумот дар бораи корбарон ва нақшҳои онҳо барои иҷрои аутентификатсия тавсиф мекунад. Tomcat маҷмӯи татбиқҳои гуногуни Амнияти Амниятро пешниҳод мекунад, ки яке аз онҳо " Яас Realm " мебошад. Пас аз фаҳмидани истилоҳоти каме, биёед контексти Tomcat-ро дар файл тавсиф кунем /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— номи ариза. Tomcat кӯшиш мекунад, ки ин номро бо номҳои дар configFile. configFile- ин "файли конфигуратсияи воридшавӣ" аст. Намунаи инро дар ҳуҷҷатҳои JAAS дидан мумкин аст: " Замимаи B: Намунаи конфигуратсияҳои воридшавӣ ". Илова бар ин, муҳим аст, ки ин файл аввал дар захираҳо ҷустуҷӯ карда шавад. Аз ин рӯ, барномаи веби мо метавонад худи ин файлро таъмин кунад. Аттрибутҳо userClassNamesва roleClassNamesдорои нишонаи синфҳое мебошанд, ки принсипи корбарро намояндагӣ мекунанд. JAAS мафҳумҳои "корбар" ва "нақш" -ро ҳамчун ду мафҳуми гуногун ҷудо мекунад java.security.Principal. Биёед синфҳои дар боло зикршударо тавсиф кунем. Биёед татбиқи соддатаринро барои мудири корбар эҷод кунем:
public class UserPrincipal implements Principal {
    private String name;
    public UserPrincipal(String name) {
        this.name = name;
    }
    @Override
    public String getName() {
        return name;
    }
}
Мо маҳз ҳамон амалро барои RolePrincipal. Тавре ки шумо аз интерфейс мебинед, чизи асосӣ барои Принсипал нигоҳ доштан ва баргардонидани баъзе ном (ё ID), ки Принсипалро ифода мекунад, мебошад. Ҳоло мо як минтақаи амният дорем, мо синфҳои асосӣ дорем. Барои пур кардани файл аз configFileатрибути " " боқӣ мемонад, ака login configuration file. Тавсифи онро дар ҳуҷҷатҳои Tomcat пайдо кардан мумкин аст: " The Realm Component ".
JAAS — Мукаддима ба технология (кисми 1) — 7
Яъне мо метавонем танзимоти JAAS Login Config-ро дар захираҳои замимаи веби худ ҷойгир кунем ва ба шарофати Tomcat Context мо метавонем онро истифода барем. Ин файл бояд ҳамчун манбаи ClassLoader дастрас бошад, аз ин рӯ роҳи он бояд чунин бошад: \src\main\resources\jaas.config Биёед мундариҷаи ин файлро танзим кунем:
JaasLogin {
    jaas.login.JaasLoginModule required debug=true;
};
Қобor зикр аст, ки context.xmlҳамон ном дар ин ҷо ва дар. Ин минтақаи Амниятро ба LoginModule харита мекунад. Ҳамин тавр, Tomcat Context ба мо гуфт, ки кадом синфҳо роҳбаронро намояндагӣ мекунанд ва инчунин кадом LoginModule-ро истифода бурдан лозим аст. Ҳамаи мо бояд кор кунем, ки ин LoginModule-ро амалӣ кунем. LoginModule шояд яке аз чизҳои ҷолибтарин дар JAAS бошад. Ҳуҷҷатҳои расмӣ ба мо дар таҳияи LoginModule кӯмак хоҳанд кард: " Java Authentication and Authorization Service (JAAS): Дастури таҳиягари LoginModule ". Биёед модули воридшавиро амалӣ кунем. Биёед синферо созем, ки интерфейсро амалӣ мекунад LoginModule:
public class JaasLoginModule implements LoginModule {
}
Аввалан мо усули оғозёбиро тавсиф мекунем 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;
}
Ин усул захира мекунад Subject, ки мо онро минбаъд тасдиқ карда, бо маълумот дар бораи асосҳо пур мекунем. Мо инчунин барои истифодаи оянда захира хоҳем кард CallbackHandler, ки ба мо дода мешавад. Бо кӯмак, CallbackHandlerмо метавонем маълумоти гуногунро дар бораи мавзӯи аутентификатсия каме дертар дархост кунем. Шумо метавонед дар ин бора CallbackHandlerдар қисмати мувофиқи ҳуҷҷатҳо хонед: " Дастури истинод аз JAAS: CallbackHandler ". Баъдан, усули loginаутентификатсия иҷро карда мешавад Subject. Ин марҳилаи якуми аутентификатсия аст:
@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мо набояд онро тағир диҳем Subject. Чунин тағйирот бояд танҳо дар усули тасдиқ ба амал ояд commit. Баъдан, мо бояд усули тасдиқи аутентификатсияи муваффақро тавсиф кунем:
@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;
}
Аз хам чудо кардани усул loginва commit. Аммо нукта дар он аст, ки модулҳои воридшавӣ метавонанд якҷоя карда шаванд. Ва барои тасдиқи бомуваффақият метавонад бомуваффақият кор кардани якчанд модули воридшавӣ зарур бошад. Ва танҳо агар ҳамаи модулҳои зарурӣ кор карда бошанд, тағиротро захира кунед. Ин марҳилаи дуюми аутентификатсия аст. Биёед бо усулҳо abortва усулҳо хотима диҳем 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;
}
Ин усул abortвақте даъват карда мешавад, ки марҳилаи якуми аутентификатсия ноком мешавад. Усул logoutҳангоми баромадан аз система даъват карда мешавад. Пас аз татбиқи худ Login Moduleва танзим кардани он Security Realm, ҳоло мо бояд web.xmlдалелро нишон диҳем, ки мо мехоҳем як чизи мушаххасро истифода барем Login Config:
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>JaasLogin</realm-name>
</login-config>
Мо номи минтақаи Амнияти худро муайян кардем ва Усули аутентификатсия - BASIC -ро муайян кардем. Ин яке аз намудҳои аутентификатсияест, ки дар API Servlet дар бахши " 13.6 Authentication " тавсиф шудааст. боқӣ монд н
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION