JavaRush /Blog Jawa /Random-JV /JAAS - Pengantar Teknologi (Bagian 2)
Viacheslav
tingkat

JAAS - Pengantar Teknologi (Bagian 2)

Diterbitake ing grup
Lanjutan saka bagean pisanan artikel babagan JAAS. Ayo dadi ngerti apa iku bisa kanggo nggunakake mung anotasi kanggo JAAS, lan masalah apa kita bakal nemokke. Kita bakal sinau ing bagean iki alat Servlet API sing ngidini kita nggawe kode luwih universal. Lan ayo diringkes apa sing diwaca.
JAAS - Pengantar Teknologi (Bagian 2) - 1

Terusane

Ing bagean pisanan saka review teknologi JAAS (ndeleng " JAAS - Pambuka Teknologi (Part 1) ") kita ndeleng kasus panggunaan utama kanggo JAAS lan API Servlet. Kita weruh manawa wadah servlet Tomcat ngatur keamanan aplikasi web kita nggunakake arsitektur JAAS. Duwe kawruh babagan "auth-method" lan "Security Realm", wadhah Tomcat dhewe nyedhiyakake implementasine mekanisme otentikasi sing dibutuhake lan nyedhiyakake CallbackHandler, kita mung nggunakake kabeh ing modul login. Siji-sijine sing penting kanggo elinga yaiku browser nyimpen data login lan sandhi sing dikirim liwat otentikasi BASIC. Mula, kanggo saben pindai anyar nggunakake Chrome, sampeyan bisa menet Ctrl+Shift+N kanggo mbukak jendela anyar supaya bisa digunakake ing mode incognito.
JAAS - Pengantar Teknologi (Bagian 2) - 2

Anotasi

Konfigurasi nggunakake XML wis suwe ora ana. Mulane, iku penting kanggo ngomong sing miwiti karo Servlet API versi 3.0, kita duwe kesempatan kanggo nyetel setelan servlet nggunakake anotasi, tanpa nggunakake web.xml penyebaran berkas deskriptor. Ayo ndeleng kepiye manajemen keamanan bakal diganti yen nggunakake anotasi. Lan apa bisa ngetrapake pendekatan sing diterangake ing ndhuwur nggunakake anotasi? Spesifikasi Servlet API lan bagean " Anotasi lan pluggability " maneh bakal mbantu kita ngerti anotasi . Bagean iki ujar manawa deklarasi servlet web.xmlbisa diganti karo anotasi @WebServlet. Dadi, servlet kita bakal katon kaya iki:
@WebServlet(name="app", urlPatterns = "/secret")
public class App extends HttpServlet {
Sabanjure, ayo goleki bab " 13.3 Keamanan Terprogram ". Ngandika yen kita uga bisa ngumumake Kendala Keamanan liwat anotasi:
@WebServlet(name="app", urlPatterns = "/secret")
@ServletSecurity(httpMethodConstraints = {
        @HttpMethodConstraint(value = "GET", rolesAllowed = "admin")
})
public class App extends HttpServlet {
Saiki web.xmlmung ana siji blok sing isih ana ing kita - login-config. Masalahe mung kedadeyan yen ora ana cara kanggo ngganti kanthi gampang lan gampang. Amarga sambungan sing cedhak antarane setelan keamanan aplikasi web lan setelan keamanan server web, ora ana cara sing prasaja lan universal kanggo nindakake iki, sanajan kanthi program. Iki minangka salah sawijining masalah karo otentikasi nggunakake JAAS lan Servlet API. Ngomong babagan pamblokiran login-config, iku worth pangerten sing iku gambaran deklaratif saka Mekanisme Authentication, i.e. mekanisme otentikasi. Ora ana cara universal sing gampang kanggo ngganti, amarga ... pangolahan web.xmlkedadeyan ing jero kontaner servlet. Contone, ing Tomcat sampeyan bisa ndeleng sumber ContextConfig.java . Mulane, sanajan kanggo wadhah servlet Tomcat ana sawetara opsi lan kabeh beda. Contone, yen kita nggunakake wadhah servlet Tomcat Embedded (yaiku, kita ngunggahake server web saka kode), mula sampeyan bisa maca babagan pilihan kasebut ing kene: " Tomcat sing disemat kanthi otentikasi dhasar liwat kode ". Kajaba iku, conto umum ngunggahake Embedde Tomcat bisa dideleng ing pandhuan platform Heroku PaaS: " Nggawe Aplikasi Web Java Nggunakake Tomcat Embedded ". Yen Tomcat ora digunakake ing mode Embedded, banjur kanggo Tomcat sampeyan bisa nggunakake pendekatan sing umum digunakake - pamireng acara. Ing Tomcat iki minangka " Komponèn Pendengar LifeCycle ". Ing wektu sing padha, penting kanggo ngerti manawa kontaner servlet (ing kasus Tomcat) bisa uga duwe loader kelas dhewe lan ora bisa njupuk lan nggunakake kelas sampeyan. Kanggo Tomcat sampeyan kudu ngerti " Class Loader HOW-TO ". Ing wadhah servlet liyane sing diarani Undertow, iki bisa digayuh nggunakake " Ekstensi Servlet ". Kaya sing sampeyan ngerteni, sawetara wis nyedhiyakake mekanisme sing luwih fleksibel, dene liyane ora. Nalika sampeyan bisa ndeleng, ora ana pilihan siji. Kabeh mau beda banget. Apa bisa kanggo nindakake soko universal mung karo Servlet API lan JAAS? Ing Internet sampeyan bisa nemokake proposal kanggo nggunakake Servlet Filter kanggo nindakake otentikasi tanpa pamblokiran login-config. Ayo pungkasane nimbang pilihan iki. Iki bakal ngidini kita mbaleni cara kerja JAAS.
JAAS - Pengantar Teknologi (Part 2) - 3

Filter Auth

Dadi, tujuane yaiku mbusak web.xmlfile kasebut kanthi lengkap. Yen kita nyingkirake, sayangé, kita ora bakal bisa nggunakake Kendala Keamanan maneh, amarga pangolahan bisa kedadeyan luwih awal tinimbang saringan servlet ditrapake. Iki ragad sampeyan kudu mbayar kanggo "versatility" nggunakake saringan. Sing. kita kudu mbusak anotasi @ServletSecurity, lan kabeh mriksa sing sadurunge diterangake ing watesan keamanan kudu dileksanakake programmatically. Nalika sampeyan bisa ndeleng, pilihan iki uga nemtokke akeh Watesan karu ing kita. Kaping pisanan, ayo mbusak anotasi @ServletSecuritysaka sumber lan blok login-configsaka file web.xml. Saiki, awake dhewe kudu ngetrapake otentikasi Dasar. Saiki ayo nambah filter kita:
@WebFilter("/*")
public class JaasFilter implements javax.servlet.Filter {
Nganti saiki katon prasaja. Ayo nulis metode inisialisasi:
@Override
public void init(FilterConfig filterConfig) throws ServletException {
	String jaas_conf = filterConfig.getServletContext().getRealPath("/WEB-INF/jaas.config");
	System.getProperties().setProperty("java.security.auth.login.config",jaas_conf);
}
Kaya sing sampeyan ngerteni, saiki kita kepeksa nggunakake alat JAAS dhasar kanggo nggoleki file konfigurasi jaas. Iki duwe kekurangan gedhe - yen ana sawetara aplikasi, siji aplikasi bisa ngrusak otentikasi liyane. Cara umum sampeyan bisa nyetel file Jaas Config diterangake kanthi rinci ing dokumentasi JAAS: " Lampiran A: Setelan JAAS ing File Properti Keamanan java.security ". Sabanjure, kita bakal njlèntrèhaké cara nyaring dhewe. Ayo miwiti kanthi nampa panjalukan HTTP:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	HttpServletRequest req = (HttpServletRequest) request;
	// Если в реквесте уже есть Principal - ничего не делаем
	if (req.getUserPrincipal() != null ) {
		chain.doFilter(request, response);
	}
Kabeh iku prasaja ing kene. Yen Principal kasedhiya, banjur otentikasi sukses. Sabanjure, sampeyan kudu njlèntrèhaké tumindak panyaring nalika pangguna durung lulus otentikasi, i.e. dheweke durung dikenali. Sadurunge kita njlèntrèhaké cara otentikasi dhasar, BASIC. Amarga Amarga saiki kita nulis filter dhewe, kita kudu ngerti kepiye otentikasi BASIC bener-bener bisa digunakake. Sampeyan bisa nggunakake " MDN web docs: HTTP authorization ". Lan uga " Carane Otentikasi HTTP Bisa? " Saka katrangan babagan cara otentikasi dhasar, jelas yen server pengin nindakake otentikasi BASIC, lan pangguna durung nyedhiyakake data, banjur server ngirim header khusus "WWW-Authenticate" lan kode kesalahan 401. Ayo nggawe cara internal kanggo iki:
private void requestNewAuthInResponse(ServletResponse response) throws IOException {
	HttpServletResponse resp = (HttpServletResponse) response;
	String value = "Basic realm=\"JaasLogin\"";
	resp.setHeader("WWW-Authenticate", value);
	resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
Saiki ayo gunakake metode iki lan tambahake doFilterblok kode ing ngisor iki menyang metode kasebut:
// Получаем security Header. А если его нет - запрашиваем
String secHeader = req.getHeader("authorization");
if (secHeader == null) {
	requestNewAuthInResponse(response);
}
Saiki ayo nambah cabang kanggo if, sing bakal dieksekusi nalika header wis dikirim:
// Проверяем аутентификацию
else {
	String authorization = secHeader.replace("Basic ", "");
	Base64.Decoder decoder = java.util.Base64.getDecoder();
	authorization = new String(decoder.decode(authorization));
	String[] loginData = authorization.split(":");
	try {
		if (loginData.length == 2) {
			req.login(loginData[0], loginData[1]);
			chain.doFilter(request, response);
		} else {
			requestNewAuthInResponse(response);
		}
	} catch (ServletException e) {
		requestNewAuthInResponse(response);
	}
}
Sampeyan bisa nambah wewenang kanggo kode iki, contone: req.isUserInRole("admin") Dadi kita wis rampung bukti asli karo sampeyan nggunakake saringan. Ing tangan siji, ana akeh kode lan pangolahan manual. Ing tangan liyane, ana versatility lan kamardikan server.
JAAS - Pengantar Teknologi (Bagian 2) - 4

Kesimpulan

Saiki kita wis tekan pungkasan review iki. Muga-muga saiki bakal dadi luwih cetha apa JAAS, apa subyek lan apa Kepala Sekolah. Tembung Keamanan Realm lan Login Config ora bakal takon maneh. Kajaba iku, kita saiki ngerti carane nggunakake JAAS lan Servlet API bebarengan. Kajaba iku, kita sinau babagan bottlenecks ing ngendi anotasi ing Servlet API ora bakal nylametake kita. Mesthi, iki ora kabeh. Contone, otentikasi ing Jawa bisa uga ora mung BASIC. Sampeyan bisa ndeleng babagan jinis liyane ing spesifikasi API Servlet ing bagean " 13.6 Authentication ". Pancen angel golek informasi rinci babagan JAAS ing Internet. Nanging aku bisa menehi rekomendasi materi iki: Muga-muga informasi saka review iki bisa migunani lan bisa dingerteni. #Viacheslav
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION