JavaRush /Java-Blog /Random-DE /JAAS – Einführung in die Technologie (Teil 2)
Viacheslav
Level 3

JAAS – Einführung in die Technologie (Teil 2)

Veröffentlicht in der Gruppe Random-DE
Fortsetzung des ersten Teils des Artikels über JAAS. Lassen Sie uns herausfinden, ob es möglich ist, nur Annotationen für JAAS zu verwenden, und auf welche Probleme wir stoßen werden. In diesem Teil erfahren Sie, mit welchen Servlet-API-Tools wir den Code universeller gestalten können. Und fassen wir zusammen, was wir gelesen haben.
JAAS – Einführung in die Technologie (Teil 2) – 1

Fortsetzung

Im ersten Teil der Überprüfung der JAAS-Technologie (siehe „ JAAS – Einführung in die Technologie (Teil 1) “) haben wir uns den Hauptanwendungsfall für JAAS und die Servlet-API angesehen. Wir haben gesehen, dass der Tomcat-Servlet-Container die Sicherheit unserer Webanwendung mithilfe der JAAS-Architektur verwaltet. Da wir über die „Authentifizierungsmethode“ und den „Sicherheitsbereich“ Bescheid wussten, lieferte uns der Tomcat-Container selbst die notwendige Implementierung des Authentifizierungsmechanismus und stellte uns selbst den CallbackHandler zur Verfügung. Wir haben alles einfach in unserem Anmeldemodul verwendet. Wichtig ist lediglich, dass der Browser die über die BASIC-Authentifizierung übermittelten Login- und Passwortdaten speichert. Daher können Sie bei jedem neuen Scan mit Chrome Strg+Umschalt+N drücken , um ein neues Fenster zu öffnen und im Inkognito-Modus zu arbeiten.
JAAS – Einführung in die Technologie (Teil 2) – 2

Anmerkungen

Die Konfiguration mittels XML ist längst aus der Mode gekommen. Daher ist es wichtig zu sagen, dass wir ab der Servlet-API-Version 3.0 die Möglichkeit haben, Servlet-Einstellungen mithilfe von Annotationen festzulegen, ohne die Bereitstellungsdeskriptordatei web.xml zu verwenden. Sehen wir uns an, wie sich das Sicherheitsmanagement ändert, wenn wir Anmerkungen verwenden. Und ist es möglich, die oben beschriebenen Ansätze mithilfe von Annotationen umzusetzen? Die Servlet-API-Spezifikation und ihr Abschnitt „ Annotationen und Pluggability “ werden uns erneut dabei helfen, Annotationen zu verstehen . In diesem Abschnitt heißt es, dass eine Servlet-Deklaration web.xmldurch eine Annotation ersetzt werden kann @WebServlet. Dementsprechend sieht unser Servlet so aus:
@WebServlet(name="app", urlPatterns = "/secret")
public class App extends HttpServlet {
Schauen wir uns als nächstes das Kapitel „ 13.3 Programmatische Sicherheit “ an. Darin heißt es, dass wir eine Sicherheitsbeschränkung auch durch Anmerkungen deklarieren können:
@WebServlet(name="app", urlPatterns = "/secret")
@ServletSecurity(httpMethodConstraints = {
        @HttpMethodConstraint(value = "GET", rolesAllowed = "admin")
})
public class App extends HttpServlet {
Jetzt web.xmlist bei uns nur noch ein Block übrig - login-config. Das Problem ist, dass es einfach keine Möglichkeit gibt, es einfach und unkompliziert auszutauschen. Aufgrund der engen Verbindung zwischen den Sicherheitseinstellungen von Webanwendungen und den Sicherheitseinstellungen des Webservers gibt es keine einfache und universelle Möglichkeit, dies zu tun, auch nicht programmgesteuert. Dies ist eines der Probleme bei der Authentifizierung mithilfe von JAAS und der Servlet-API. Wenn man über den Block spricht login-config, sollte man verstehen, dass es sich um eine deklarative Beschreibung von Authentifizierungsmechanismen handelt, d. h. Authentifizierungsmechanismen. Es gibt immer noch keine einfache, universelle Möglichkeit, es zu ersetzen, weil... Die Verarbeitung web.xmlerfolgt tief in den Servlet-Containern. In Tomcat können Sie sich beispielsweise die Quelle ContextConfig.java ansehen . Daher gibt es auch für den Tomcat-Servlet-Container mehrere Optionen, die alle unterschiedlich sind. Wenn wir beispielsweise den Embedded Tomcat Servlet-Container verwenden (d. h. wir erstellen einen Webserver aus Code), können Sie hier über solche Optionen lesen: „ Embedded Tomcat mit Basisauthentifizierung per Code “. Darüber hinaus finden Sie im Leitfaden zur Heroku-PaaS-Plattform ein allgemeines Beispiel für die Entwicklung von Embedde Tomcat: „ Erstellen Sie eine Java-Webanwendung mit eingebettetem Tomcat “. Wenn Tomcat nicht im eingebetteten Modus verwendet wird, können Sie für Tomcat einen häufig verwendeten Ansatz verwenden – Ereignis-Listener. In Tomcat ist dies „ The LifeCycle Listener Component “. Gleichzeitig ist es wichtig zu verstehen, dass Servlet-Container (in unserem Fall Tomcat) möglicherweise über eigene Klassenlader verfügen und es nicht möglich ist, Ihre Klassen einfach zu übernehmen und zu verwenden. Für Tomcat müssen Sie das „ Class Loader HOW-TO “ verstehen. In einem anderen Servlet-Container namens Undertow kann dies mithilfe von „ Servlet-Erweiterungen “ erreicht werden. Wie Sie sehen, haben einige flexiblere Mechanismen bereitgestellt, andere nicht. Wie Sie sehen, gibt es keine einzige Option. Sie sind alle sehr unterschiedlich. Ist es möglich, mit nur der Servlet-API und JAAS irgendwie etwas Universelles zu erreichen? Im Internet finden Sie einen Vorschlag, den Servlet-Filter zu verwenden, um eine Authentifizierung ohne Blockierung durchzuführen login-config. Betrachten wir abschließend diese Option. Dadurch können wir wiederholen, wie JAAS funktioniert.
JAAS – Einführung in die Technologie (Teil 2) – 3

Authentifizierungsfilter

web.xmlUnser Ziel ist es also, die Datei vollständig zu entfernen . Wenn wir es loswerden, können wir die Sicherheitseinschränkung leider nicht mehr verwenden, weil Ihre Verarbeitung kann viel früher erfolgen, als die Servlet-Filter angewendet werden. Dies ist die Gebühr, die Sie für die „Vielseitigkeit“ der Verwendung von Filtern zahlen müssen. Diese. Wir müssen die Annotation entfernen @ServletSecurityund alle Überprüfungen, die wir zuvor in der Sicherheitsbeschränkung beschrieben haben, müssen programmgesteuert durchgeführt werden. Wie Sie sehen, bringt diese Option auch für uns viele unangenehme Einschränkungen mit sich. Entfernen wir zunächst die Annotation @ServletSecurityaus der Ressource und den Block login-configaus der web.xml. Jetzt müssen wir selbst die Standardauthentifizierung implementieren. Jetzt fügen wir unseren Filter hinzu:
@WebFilter("/*")
public class JaasFilter implements javax.servlet.Filter {
Bisher scheint es einfach zu sein. Schreiben wir eine Initialisierungsmethode:
@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);
}
Wie Sie sehen, sind wir jetzt gezwungen, grundlegende JAAS-Tools zu verwenden, um nach der Jaas-Konfigurationsdatei zu suchen. Dies hat einen großen Nachteil: Wenn es mehrere Anwendungen gibt, kann eine Anwendung die Authentifizierung einer anderen unterbrechen. Wie Sie generell eine Jaas-Konfigurationsdatei festlegen können, ist in der JAAS-Dokumentation ausführlich beschrieben: „ Anhang A: JAAS-Einstellungen in der java.security Security Properties File “. Als nächstes beschreiben wir die Filtermethode selbst. Beginnen wir mit dem Empfang einer HTTP-Anfrage:
@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);
	}
Hier ist alles einfach. Wenn Principal verfügbar ist, ist die Authentifizierung erfolgreich. Als nächstes müssen Sie die Aktionen des Filters beschreiben, wenn der Benutzer die Authentifizierung nicht bestanden hat, d. h. er wurde noch nicht erkannt. Zuvor haben wir die grundlegende Authentifizierungsmethode BASIC beschrieben. Weil Da wir den Filter jetzt selbst schreiben, müssen wir herausfinden, wie die BASIC-Authentifizierung tatsächlich funktioniert. Sie können „ MDN-Webdokumente: HTTP-Autorisierung “ verwenden. Und auch „ Wie funktioniert die HTTP-Authentifizierung? “ Aus der Beschreibung der Funktionsweise der Basisauthentifizierung geht klar hervor, dass der Server einen speziellen Header „WWW-Authenticate“ und den Fehlercode 401 sendet, wenn der Server eine BASIC-Authentifizierung durchführen möchte und der Benutzer keine Daten bereitgestellt hat. Erstellen wir eine interne Methode hierfür:
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);
}
Nun verwenden wir diese Methode und fügen doFilterder Methode den folgenden Codeblock hinzu:
// Получаем security Header. А если его нет - запрашиваем
String secHeader = req.getHeader("authorization");
if (secHeader == null) {
	requestNewAuthInResponse(response);
}
Fügen wir nun einen Zweig für hinzu if, der ausgeführt wird, wenn der Header bereits übertragen wurde:
// Проверяем аутентификацию
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);
	}
}
Sie können diesem Code beispielsweise eine Autorisierung hinzufügen: req.isUserInRole("admin") Wir haben also mithilfe eines Filters eine Authentifizierung bei Ihnen durchgeführt. Einerseits gibt es viel Code und manuelle Verarbeitung. Auf der anderen Seite stehen Vielseitigkeit und Serverunabhängigkeit.
JAAS – Einführung in die Technologie (Teil 2) – 4

Abschluss

Nun sind wir am Ende dieser Rezension angelangt. Ich hoffe, es wird jetzt etwas klarer, was JAAS ist, was ein Subjekt ist und was Prinzipale sind. Die Wörter „Security Realm“ und „Login Config“ werfen keine Fragen mehr auf. Darüber hinaus wissen wir jetzt, wie man JAAS und die Servlet-API zusammen verwendet. Darüber hinaus haben wir von Engpässen erfahren, bei denen Annotationen in der Servlet-API uns nicht retten können. Das ist natürlich noch nicht alles. Beispielsweise ist die Authentifizierung in Java möglicherweise nicht nur BASIC. Informationen zu anderen Typen finden Sie in der Servlet-API-Spezifikation im Abschnitt „ 13.6 Authentifizierung “. Es ist schwierig, detaillierte Informationen zu JAAS im Internet zu finden. Aber ich kann dieses Material empfehlen: Ich hoffe, dass die Informationen aus dieser Rezension nützlich und verständlich sind. #Wjatscheslaw
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION