dimanche 14 décembre 2008

SSO CAS exemple de servlet

Utiliser la librairie client CAS de Yale dans le cadre d'un servlet est très simple :
Une fois récupéré le ticket , le servlet doit le faire valider par le serveur CAS de cette facon :


/* contact CAS and validate */
sv.validate();

/* if we want to look at the raw response, we can use getResponse() */
xmlResponse = sv.getResponse();

/* read the response */

// Yes, this method is misspelled in this way
// in the ServiceTicketValidator implementation.
// Sorry.
if(sv.isAuthenticationSuccesful()) {
user = sv.getUser();
} else {
errorCode = sv.getErrorCode();
errorMessage = sv.getErrorMessage();
/* handle the error */
}

Il reste un problème : Le client CAS standard n'accepte de valider un ticket qu'en utilisant le protocole HTTPS. Or pour les tests, il est parfois plus facile d'utiliser HTTP pour faciliter la capture des trames réseaux.

J'ai donc adapté le client CAS de cette façon :

Attention le code semble complexe mais il est une série de copier/coller



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import edu.yale.its.tp.cas.client.*;
import org.xml.sax.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.*;

public class MyServlet extends HttpServlet {

public void init() {
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

String CASLogin = "http://cas.demo.net/cas/login" ;
String CASValidate = "http://cas.demo.net/cas/serviceValidate/" ;
String UrlMonService = "http://serviceprovider.demo.net:8080/servlets- examples/servlet/myservlet";

String ticket = req.getParameter( "ticket");
if (ticket == null )
{
res.sendRedirect( CASLogin + "?service=" +UrlMonService);
} else {
res.setContentType("text/html");
PrintWriter out = res.getWriter();


edu.yale.its.tp.cas.client.ServiceTicketValidator st = new edu.yale.its.tp.cas.client.ServiceTicketValidator();
st.setCasValidateUrl(CASValidate);
st.setServiceTicket( ticket );
st.setService( UrlMonService );
StringBuffer sb = new StringBuffer();
sb.append(CASValidate);
if (CASValidate.indexOf('?') == -1)
sb.append('?');
else
sb.append('&');
sb.append("service=" + UrlMonService + "&ticket=" + ticket);
String url = sb.toString();
BufferedReader r = null;
String response="" ;

try {
URL u = new URL(url);
URLConnection uc = u.openConnection();
uc.setRequestProperty("Connection", "close");
r = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String line;
StringBuffer buf = new StringBuffer();
while ((line = r.readLine()) != null)
buf.append(line + "\n");
response = buf.toString();
} finally {
try {
if (r != null)
r.close();
} catch (IOException ex) {
// ignore
}


}
Integer result =0;
String user="";
/* reponse negative */
if (response.indexOf("authenticationFailure") >= 0 )
{
result =0 ;
} else
{
result =1 ;
Pattern p = Pattern.compile("(.+)");
Matcher m = p.matcher(response);
if (m.find()) {
// recup du user
user= m.group(1) ;
}
}

out.println("");
out.println(" Titre ");
out.println("");
out.println("Ma première servlet v5 CAS Client ");
if (result == 1 )
{
out.println("connexion reussie pour l\'utilisateur:" + user );
out.println("Avec le ticket " + ticket);
} else {
out.println("ERREUR de connexion" );
out.println("ticket " + ticket);
}
out.println("");
out.println("");
out.close();
}
}





}


Good hacking


Aucun commentaire: