Kontext injiziert SecurityContext null ist
Habe ich eine Javae EE-Anwendung mit JAX-RS 2.0 und JPA. Ich erstellt einen speziellen Anbieter meine Benutzer-Entität (mit Qualifier), um die aktuelle Benutzer (angemeldet), als Einheit von Anwendungen, die Benutzer-Datenbank.
Um den aktuellen Benutzer ich benutze
@Context
private SecurityContext secContext;
Das problem ist, dass diese null ist. Die Sicherheit ist das setup in Ordnung (Wildfly 8.2) - die app fragt nach Authentifizierung (basic), aber SecurityContext
null ist. Hier ist der code:
@RequestScoped
public class CurrentUserProducer implements Serializable {
/**
* Default
*/
private static final long serialVersionUID = 1L;
@Context
private SecurityContext secContext;
/**
* Tries to find logged in user in user db (by name) and returns it. If not
* found a new user with role {@link UserRole#USER} is created.
*
* @return found user a new user with role user
*/
@Produces
@CurrentUser
public User getCurrentUser() {
if (secContext == null) {
throw new IllegalStateException("Can't inject security context - security context is null.");
//... code to retrieve or create new user
return user;
}
}
Wie Sie sehen, ich check secContext
für null, und ich sehe meine Ausnahme, sobald ich versuche zu erreichen, eine Ressource, die injiziert @CurrentUser
.
So, wie ich dieses Problem lösen? Warum ist SecurityContext
null.
InformationsquelleAutor dermoritz | 2015-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in meinem Kommentar
Noch nicht getestet, aber scheint zu funktionieren für die OP. Dies ist ein EE-stack-Lösung.
Anderen JAX-RS (Resteasy bestimmte) Art und Weise zu ermöglichen, ist die Injektion mit Hilfe der
ResteasyProviderFactory
(gefunden mit Hilfe von diese Antwort). Sie können diese in einemContainerRequestFilter
, die Zugang zu denSecurityContext
. Wir können das RESTeasy-utility-Klasse, um die push -User
in den Kontext. Dies ermöglicht die Injektion mit dem@Context
annotation. Nicht sicher, wie/ob es funktionieren würde, mit einem benutzerdefinierten annotation obwohl. Hier ist ein BeispielHinweis: dies ist eine JAX-RS-2.0-Lösung (d.h. RESTeasy 3.x.x). Vor 2.0, es gibt keine
ContainerRequestFilter
InformationsquelleAutor Paul Samsotha
Ich einen anderen Weg gefunden, um die Klasse erkannte von Jax-Rs: Implementierung der ContextResolver und Annotation der Klasse mit Anbieter.
Die Schnittstelle implementieren, fügte ich hinzu:
Ich bin nicht sicher, aber wahrscheinlich mit das ich tun kann,
@Kontext
private User currentUser;
Aber ich habe nicht versucht. Aber die Injektion via qualifier arbeitet jetzt (security context injiziert wird).
User
zu sehen, dass es es funktioniert?Nein, ich habe nicht versucht, noch hätte ich umgestalten seome-code (einschließlich tests). Aber zumindest alle Rahmen-Material injiziert werden in eine Klasse annotiert mit @Provider (müssen implementiert jax-rs-interface)
InformationsquelleAutor dermoritz