Unerklärliche SecurityException

S

StefGe

Hallo,

ich habe folgendes Problem:
Ich habe zwei Tabellen:
kunde (kunden_id, name, vorname, strasse, hausnummer, ort_id)
ort (ort_id, plz, ortsname, land) - plz. ortsname und land sind eindeutig

Diese Beziehung der EntityBeans habe ich über CMR beschrieben und funktioniert auch einwandfrei. Ich ändere die Daten eines Kunden, kommentiere ich den Teil mit der Änderung des Ortes aus, funktioniert alles einwandfrei! So, komme ich zum Ort: ich schaue als erstes, ob der Ort bereits existiert, ja, dann hole ich mir die ID, ansonsten lege ich den Ort an und lasse mir dann die neue ID geben. Diese wird dann in der Tabelle Kunde upgedatet. Jetzt bekomme ich von meinem Webcontainer eine SecurityException geworfen, wenn mein Servlet versucht, sich eine Instanz vom SessionBean zu holen:

(nur ein Auszug)
java.rmi.AccessException: SecurityException; nested exception is:
javax.security.auth.login.LoginException: java.lang.NullPointerException
at org.jboss.security.Util.createPasswordHash(Util.java:356)
at org.jboss.security.auth.spi.UsernamePasswordLoginModule.createPasswordHash(UsernamePasswordLoginModule.java:298)
at org.jboss.security.auth.spi.UsernamePasswordLoginModule.login(UsernamePasswordLoginModule.java:160)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
at org.jboss.security.plugins.JaasSecurityManager.defaultLogin(JaasSecurityManager.java:483)
at org.jboss.security.plugins.JaasSecurityManager.authenticate(JaasSecurityManager.java:425)
at org.jboss.security.plugins.JaasSecurityManager.isValid(JaasSecurityManager.java:251)

Ich habe schon bei meiner SessionBean folgendes eingestellt: @ejb.permission unchecked="true", hilft aber nichts. Wenn ich die SecurityDomain aus meiner EJB-Anwendung entferne, dann klappt es aber. Ach übrigens, in der Datenhbank wird alles richtig eingetragen. Starte ich mein entsprechendes Servlet per Hand mit dem Aufruf Controller?action=login nach der Exception, dann klappt es auch wieder. Ich vermute, es ist die Art und Weise, wie ich meine OrtID update, daher hier der Quellcode:

// Ort in der Datenbank ablegen
PlaceLocal pl = null;
try {
// sucht den Ort in der Datenbank
pl = plh.findByPlace(user.getPostalCode(), user.getTown(), user.getCountry());
} catch (FinderException e) {
// Ort nicht gefunden
try {
// Ort wird in der Datenbank neu angelegt
pl = plh.create(user.getPostalCode(), user.getTown(), user.getCountry());
} catch (CreateException e1) {
e1.printStackTrace();
}
}
cl.setPlaceId(pl.getPlaceId());

Über Hilfe wäre ich sehr dankbar, ich hänge hier schon seit einigen Tagen.

Viele Grüße
Stefan
 
Hallo!

Kannst du dazu vielleicht mal ein minimales (Lauffähiges) Beispiel aufsetzen?
Am besten mit MySQL als DS. Dann schau ichs mir mal an.

Gruß Tom
 
Hier ist mein Projekt: http://www.gericke-web.de/eclipse.rar.
Bei der EJB-Anwendung ist die Klasse AdministrationFacade, die Methode editUser() entscheidend, und bei der Servlet-Seite editUser.jsp.

Meine Passwörter liegen mit MD5 verschlüsselt auf MySQL. Sowohl Servlets als auch EJBs kennen die entsprechende SecurityDomain, und der Login läuft einwandfrei bei mir. Ich vermute, es liegt daran, wie ich die Ort_ID bei der Tabelle Kunde update. Das darf wohl so nicht sein.

Danke für deine Hilfe, bin echt am verzweifeln.

Stefan
 
Hallo!

Ich vermute, es liegt daran, wie ich die Ort_ID bei der Tabelle Kunde update. Das darf wohl so nicht sein.
Aber die Exception
Code:
...
java.rmi.AccessException: SecurityException; nested exception is:
javax.security.auth.login.LoginException: java.lang.NullPointerException
at org.jboss.security.Util.createPasswordHash(Util.java:356)
...
lässt doch eher auf etwas anderes schließen. -> Kann es sein, dass das Passwort des User's nicht ausgelesen wird? Liegt der Principal bzw. das Subject in der Session?

Gruß Tom
 
Liegt der Principal bzw. das Subject in der Session?
Was ist das?

Das seltsame ist, kommentiere ich die Zeile mit dem Update des Fremdschlüssels (cl.setPlaceId(user.getPlaceId()) ) aus, dann funktioniert alles einwandfrei! Der Login funktioniert ja auch einwandfrei, sonst käme ich ja nicht zum editieren. Beim Servlet EditUser gehen die Daten zum EJB-Container, das Servlet schickt die anfrage weiter zum Servlet Login, in dieser dann die User-Tabelle neu ausgelesen werden soll, nur er kann nicht auf die entsprechende SessionBean zugreifen. Gebe ich jetzt nach dieser Exception gleich in der URL Controller?action=login ein, geht es wieder einwandfrei, und die aktualisierten Daten sind auch in der Datenbank.

Vielleicht ist einfach die Datenbank noch nicht soweit, und das Servlet bekommt einfach noch nicht die Berechtigung, auf die SessionBean zuzugreifen, weil der EJB-Container nicht den Benutzer authentifizieren kann. Ich habe dann Thread.sleep(10000) vor die Weiterleitung gesetzt, aber es hat auch nicht geholfen.

Ich weiß also einfach nicht, wo ich nach dem Fehler suchen muss.

Stefan
 
Hallo Tom,

hast du mittlerweile eine Idee, woran diese SecurityException liegen? Also ich bin mir mitterweile sicher, das et doch etwas mit der Security zu tun hat, denn sobald ich bei meiner EJB-Anwendung die SecurityDomain nicht angebe, geht die Anwendung einwandfrei. Ich habe aber die Berechtigung korrekt vergeben, finde einfach nicht den Fehler.
 

Neue Beiträge

Zurück