2016-08-05 74 views
0

Ich habe einen JMS Message Listner, der die Nachricht ordnungsgemäß von den Controllern erhält.Grails JMS Message konnte keine Berechtigung mit Spring Security hinzufügen

Das Verfahren sieht aus wie

@Override 
public void onMessage(Message message) { 
try { 
    def data 
    if (message instanceof TextMessage) { 
    data = ((TextMessage)message).getText(); 
    onNotificationService.testIt(new JSONObject(data)) 
    } 
    else { 
    println "Message "+message 
    } 
} catch (JMSException e) { 
    throw new RuntimeException(e); 
} 

} 

Die Daten werden dann an die testIt Methode gesendet werden, wo ich meine Operation tue. Eine der Operationen besteht darin, einige Daten hinzuzufügen, die aus diesen Daten verarbeitet wurden. Das funktioniert perfekt, wenn onNotificationService.testIt(new JSONObject(data)) direkt von controller genannt worden, es funktioniert perfekt

aclUtilService.addPermission(myObject, username, BasePermission.ADMINISTRATION) 

ich hier eine Ausnahme als Authentication Required bin immer - Dafür ich dies verwenden.

Was ich vermisse?

Jede Hilfe zu diesem sehr geschätzt.

+0

Es funktioniert in der Steuerung zu codieren, weil Sie authentifiziert sind, und das ist über ein Gewinde-local zur Verfügung, aber wenn Sie arbeiten an einem anderen Thread, es gibt keine aktive Authentifizierung mit –

+0

Das ist richtig. Meine Frage ist, wie fügen Sie aktive Authentifizierung für diese Threads hinzu? – Sirsendu

Antwort

0

Wenn ist jede Nachricht mit der Authentifizierung des Absenders der Nachricht ausgeführt werden Sie etwas in der Nachricht kodieren wollen werden und in der Server die Last auf die Security (http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/context/SecurityContext.html):

import org.springframework.security.core.context.SecurityContextHolder 
import org.springframework.security.core.Authentication 
... 
public void onMessage(Message message) { 
    ... 
    SecurityContextHolder.getContext().setAuthentication(fetchAuthentication()) 
    ... 
} 
... 
// Use some token or marker from the message to fetch the appropriate Authentication 
Authentication fetchAuthentication() {} 

Sie ändern könnte der Strategiemodus (siehe: http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/context/SecurityContextHolder.html), wenn Sie die Authentifizierung global behandeln oder von einem übergeordneten Thread erben möchten.

Wenn Sie suchen ein Zeichen irgendeiner Art in der Nachricht verwenden Sie ein JWT (https://jwt.io/)

+0

Danke für den Vorschlag. Ich habe das benutzt. Auf ihm, authentica – Sirsendu

+0

On Authentifizierungsproblem gegangen aber bald der Verbindungspool wird erschöpft – Sirsendu

+0

Der Fehler ergab sich wie folgt. [05: 36: 04.773] FEHLER org.hibernate.transaction.JDBCTransaction JDBC-Start fehlgeschlagen java.sql.SQLException: PooledConnection wurde bereits geschlossen. – Sirsendu