Jun 1, 2008

Διαβάζοντας την ταυτότητα του χρήστη (user identity) στο JAX-RPC

Η έκδοση 10.1.3 του JDeveloper παρέχει πολλές διευκολύνσεις για την ανάπτυξη Java web services, βασισμένων στο πρότυπο JAX-RPC. Μια από τις πιο σημαντικές, που διασυνδέεται πολύ καλά με τον Oracle Application Server είναι η συμμόρφωση της δικτυακής υπηρεσίας σύμφωνα με τις επιταγές ασφάλειας WS-Security (http://www.oasis-open.org/committees/wss/) προσφέροντας δυνατότητες αυθεντικοποίησης με χρήση ζεύγους κωδικού και συνθηματικού, ψηφιακής υπογραφής ή SAML token.

Πέρα όμως από αυτήν την υπηρεσία, συχνά είναι απαραίτητο να μάθουμε την ταυτότητα του χρήστη που έχει συνδεθεί, ενδεχομένως για να διαμορφώσουμε μηχανισμούς εξουσιοδότησης (authorization) ή να αλλάξουμε εν γένει τη συμπεριφορά του web service. Στο JAX-RPC υποστηρίζεται η δήλωση ειδικών κλάσεων που η εκτέλεσή τους είτε θα προηγείται είτε θα ακολουθεί την εκτέλεση του καθαυτού web service (interceptors). Αυτές οι ειδικές κλάσεις ονομάζονται JAX-RPC handlers και απλά πρέπει να υλοποιούν το interface javax.xml.rpc.handler.Handler.

Υλοποιώντας το προαναφερόμενο interface, η μέθοδος που εκτελείται κάθε φορά που καλείται η υπηρεσία μας είναι η handleRequest() και στην οποία μπορούμε να ορίσουμε τον παρακάτω κώδικα προκειμένου να διαβάσουμε τα στοιχεία του χρήστη που έχει συνδεθεί.

/**
* Intervene request.
* @param messageContext is the SOAP context.
* @return an indication of whether to proceed or not.
*/
public boolean handleRequest(MessageContext messageContext) {
boolean exit = true;

String AUTH_PROPERTY = "oracle.security.wss.authuser";
Object authProperty = messageContext.getProperty(AUTH_PROPERTY);
JAZNUserAdaptor loggedUser = (JAZNUserAdaptor)messageContext.getProperty(AUTH_PROPERTY);

logger.debug("User logged on:" + loggedUser.getName());
//Do something with the user identity.
// ...
return exit;
}


Έτσι τρέχοντας ένα οποιοδήποτε web service, επαληθεύουμε πως διαβάσαμε τα κατάλληλα στοιχεία.


No comments: