Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe von JAAS ein Subject bezogen, welches ich nun für die nachfolgenden Checks per AccessController mit dem Execution Thread verbinden muss. Wie mache ich das?
ich habe von JAAS ein Subject bezogen, welches ich nun für die nachfolgenden Checks per AccessController mit dem Execution Thread verbinden muss. Wie mache ich das?
Ich möchte Principal-basierte Securityabfragen mit dem AccessController durchführen. Nur weil mein Code irgendwann mal ein Subject vom JAAS-LoginContext holt und es in irgendeiner Instanzvariable ablegt, hat der AccessController für die nachfolgenden Abfragen ja keinen Zugriff darauf (es sei denn hier gibt es irgendwelche mir unbekannte Magie). Wie mache ich dem AccessController das Subject bekannt?
Ich habe da was gefunden, den DomainCombiner. Aber so richtig habe ich noch nicht verstanden, wie ich den standardmäßig benutzten DomainCombiner gegen den JAAS-SubjectDomainCombiner austausche.
ThreadLocals kenne ich, aber danke. Ich bemühe mich gerade ein Beispiel zusammenzubauen, damit mein Ansinnen klarer wird. Derzeit läuft das nicht so glatt - siehe mein neuer Security-spezifischer Thread: http://www.java-forum.org/de/viewtopic.php?p=445987#445987
ich habe mein Beispiel tatsächlich noch ans Laufen gekriegt. Szenario ist das Folgende: Ich habe eine Client-Server-Anwendung, bei der die Client-Swing-Applikation durch einen SecurityManager betreut wird. Dieser SecurityManager vergibt den größten Teil der Berechtigungen auf Basis der Principals des am Server (JBoss AS 4.2.1) eingeloggten Subjects, die Anwendung an sich kriegt nur die nötigen Rechte, um sich am Server anzumelden. Problem ist nun die Übernahme des von JAAS an den Client gelieferten Subjects in den Execution Thread des Swing-Clients.
Beispiel:
Die Klasse SubjectBinding meldet sich am JBoss-Server an und gibt die Klasse des erhaltenen Subjects aus (zum Beweis des erfolgten Logins). Anschließend wird eine Aktion ausgeführt, für die das eingeloggte Subject die nötigen Rechte besitzt (Lesezugriff auf eine Datei):
Code:
public class SubjectBinding {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
LoginContext lCtx = new LoginContext("jaas-test", new MyCallbackHandler());
lCtx.login();
Subject s = lCtx.getSubject();
System.out.println(s.getPrincipals().toArray()[0].getClass());
File f = new File("C:\\test.txt");
f.exists(); // Das eingeloggte Subject hat die nötigen Rechte!
}
}
// MyCallbackHandler setzt nur den Benutzernamen und das Passwort;
// weggelassen, um das Beispiel kurz zu halten.
Die dazugehörige Policy-Datei sieht wie folgt aus; der Anwendung selbst werden alle Rechte gegeben, die zum Login erforderlich sind. Das Subject, das eingeloggt wird, erhält die Rechte zur Ausführung der eigentlichen Nutzlast, dem Lesezugriff auf die Datei "test.txt":
Beim Ausführen des Beispiels kommt folgende Ausgabe:
Code:
class org.jboss.security.SimplePrincipal
Exception in thread "main" java.security.AccessControlException: access denied
(java.io.FilePermission C:\test.txt read)
Sprich, das Programm scheitert, sobald es darum geht Rechte aufgrund des eingeloggten Subjects zu erhalten. Dies liegt nach meiner Interpretation daran, dass das Subject nicht an den Execution Thread gebunden wird (warum auch?). Wie kann ich also den aktuellen AccessControlContext und das Subject bzw dessen Principals miteinander bekannt machen?