tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1287
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    StefGe Tutorials.de Gastzugang
    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(UsernamePasswordLoginModu le.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
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    StefGe Tutorials.de Gastzugang
    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
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    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 :
    1
    2
    3
    4
    5
    
    ...
    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
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    StefGe Tutorials.de Gastzugang
    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
     

  6. #6
    StefGe Tutorials.de Gastzugang
    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.
     

Ähnliche Themen

  1. SecurityException: sealing violation
    Von Skrolan im Forum Java
    Antworten: 2
    Letzter Beitrag: 04.02.10, 15:35
  2. SecurityException bei c# und Infopath
    Von zioProduct im Forum .NET Café
    Antworten: 6
    Letzter Beitrag: 30.08.06, 14:02
  3. Java Applet - XML - SecurityException
    Von flashray im Forum Java
    Antworten: 14
    Letzter Beitrag: 14.01.06, 02:03
  4. System.Security.SecurityException
    Von Tharmy im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 28.02.05, 09:37
  5. SecurityException nur bei Java 1.4.2
    Von Beanpole im Forum Java
    Antworten: 2
    Letzter Beitrag: 08.11.04, 18:31