2016-04-20 8 views
1

Ok, ich bin offiziell verwirrt.Apache Shiro: ClassCastException auf Realm

In Shiro habe ich mein eigenes Realm (DatastoreRealm), das AuthorizingRealm erweitert. In meinem DatastoreRealm habe ich die Methode "clearCachedAuthorizationInfo", die es mir ermöglicht, die Benutzerrechte usw. zu löschen (und dann erneut zu überprüfen), wenn sich diese Berechtigungen im laufenden Betrieb ändern.

Um zu dieser Methode zu gelangen, muss ich auf mein DatastoreRealm Objekt zugreifen. Ich tue dies in der folgenden Art und Weise ...

private static Realm lookupRealm(String realmName) { 
    SecurityManager securityManager = SecurityUtils.getSecurityManager(); 
    RealmSecurityManager realmSecurityManager = (RealmSecurityManager) securityManager; 

    Collection<Realm> realms = realmSecurityManager.getRealms(); 
    for (Realm realm : realms) { 
     if (realm.getName().equalsIgnoreCase(realmName)) { 
      log.info("look up realm name is : " + realm.getName()); 
      return realm; 
     } 
    } 
    return null; } 

Dies scheint gut zu funktionieren. Es gibt mir ein "DatastoreRealm" -Objekt zurück.

Obwohl, wenn ich diese Methode aufrufen, bin ich gezwungen, um folgende Aktionen ...

DatastoreRealm dsRealm = (DatastoreRealm) lookupRealm("rfRealm"); 

die eine "Classcast" wirft mir zu sagen ...

rf.gae.DatastoreRealm cannot be cast to rf.gae.DatastoreRealm 

Wie/Warum passiert dies???

Wenn ich nicht werfen DO, und einfach die „Realm“ verwenden Objekt, das „clearCachedAuthorizationInfo“ ist mir nicht möglich!

Vielen Dank im Voraus für die Hilfe!

Antwort

0

Nun mit ein bisschen mehr Graben, habe ich das Problem herausgefunden.

Das Web-Framework, das ich verwende, hat die Fähigkeit, "Hot-Reload" -Klassen zu installieren, was verhindert, dass der Server bei jeder Codeänderung neu gestartet werden muss.

Das Problem dabei ist, dass ein neuer Classloader die bearbeitete Klasse lädt, und daher kann die Klasse im Speicher nicht in die neue vom Classloader geladene Klasse umgewandelt werden, wenn ein Cast versucht wird!

Für Klassen, die umgewandelt werden, müssen sie vom selben Typ sein und vom selben Classloader geladen werden.

Das Deaktivieren dieser Funktion hat mein Casting-Problem behoben.

+0

Altes Thema aber: Könnten Sie so freundlich sein und teilen, welchen Rahmen haben Sie verwendet? Und wie hast du "hot reload" deaktiviert? – PastorPL