Apache Wicket CAS Client
Basic CAS client developed on Apache Wicket 1.5.2. Only handles authentication (not authorization strategy). Pages which need to have a CAS authentication just have to extend this class.
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import org.apache.wicket.Session;import org.apache.wicket.WicketRuntimeException;import org.apache.wicket.markup.html.WebPage;import org.apache.wicket.markup.html.pages.RedirectPage;import org.apache.wicket.model.IModel;import org.apache.wicket.protocol.http.servlet.ServletWebRequest;import org.apache.wicket.request.IRequestParameters;import org.apache.wicket.request.Request;import org.apache.wicket.request.cycle.RequestCycle;import org.apache.wicket.request.mapper.parameter.PageParameters;import org.apache.wicket.util.string.StringValue;import org.jasig.cas.client.authentication.AttributePrincipal;import org.jasig.cas.client.validation.Assertion;import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;import org.jasig.cas.client.validation.TicketValidationException;
/** * Basic CAS authenticated web page for Wicket 1.5.2. <br/> * Just import this class into your project <br/> * . All cassified pages have to extend this class<br/> * <br/> * * @author Alexandre de Pellegrin - ESSEC Business School * */public class CasAuthenticatedWebPage extends WebPage {
/** Session key which indicates if the user is already authenticated */ private static final String SSO_FLAG_AUTHENTICATED = "SSO_FLAG_AUTHENTICATED";
/** URL parameter to retrieve the CAS service ticket */ private static final String SSO_TICKET_URL_PARAM = "ticket";
/** Session key to get the currently authenticated user name */ private static final String SSO_USER_NAME = "SSO_USER_NAME";
/** Internal stuff */ private static final String BLANK_STRING = "";
/** * Your CAS server base URL. Don't forget to change it. Ex : * https://my_cas_server/cas/" */public static String SSO_CAS_BASE_URL = "https://my_cas_server/cas/";
/** * Use CasAuthenticatedWebPage(PageParameters parameters) instead */ @Deprecated public CasAuthenticatedWebPage() { super(); //throw new WicketRuntimeException("Constuctor disabled because we need to get the service ticket back from the CAS server"); }
/** * Use CasAuthenticatedWebPage(PageParameters parameters) instead */ @Deprecated public CasAuthenticatedWebPage(IModel<?> model) { super(model); //throw new WicketRuntimeException("Constuctor disabled because we need to get the service ticket back from the CAS server"); }
/** * Default constructor * * @param parameters */ public CasAuthenticatedWebPage(PageParameters parameters) { super(parameters); }
@Override protected void onBeforeRender() { super.onBeforeRender(); if (isTicketToValidate()) { boolean isValidated = validateTicket(); if (isValidated) { reloadPage(); return; } } if (!isAuthenticated()) { redirectToLoginPage(); } }
/** * @return true if the user has already been authenticated on the CAS server */ private boolean isAuthenticated() { Session session = getSession(); Serializable value = session.getAttribute(SSO_FLAG_AUTHENTICATED); if (value != null) { return true; } return false; }
/** * Redirect to the CAS login page */ private void redirectToLoginPage() { String pageURL = getPagePublicURL(); RedirectPage redirectPage = new RedirectPage(SSO_CAS_BASE_URL + "/login?service=" + pageURL); setResponsePage(redirectPage); }
/** * Reload page without the service ticket to avoid multiple submit with the same ticket */ private void reloadPage() { String pageURL = getPagePublicURL(); RedirectPage redirectPage = new RedirectPage(pageURL); setResponsePage(redirectPage); }
/** * @return the authenticated principal name */ public String getUser() { Session session = getSession(); Serializable value = session.getAttribute(SSO_USER_NAME); return value + BLANK_STRING; }
/** * @return true if there's a CAS service ticket in the current request */ private boolean isTicketToValidate() { StringValue ticketValue = getTicket(); if (!ticketValue.isNull()) { return true; } return false; }
/** * @return the current CAS service ticket */ private StringValue getTicket() { RequestCycle requestCycle = RequestCycle.get(); Request request = requestCycle.getRequest(); IRequestParameters queryParameters = request.getQueryParameters(); StringValue ticketValue = queryParameters.getParameterValue(SSO_TICKET_URL_PARAM); return ticketValue; }
/** * Validates the CAS service ticket on the CAS server */ private boolean validateTicket() { StringValue ticket = getTicket(); if (ticket.isNull()) { return false; } String ticketValue = ticket.toString(); String pageURL = getPagePublicURL(); try { Cas20ServiceTicketValidator ticketValidator = new Cas20ServiceTicketValidator(SSO_CAS_BASE_URL); Assertion assertion = ticketValidator.validate(ticketValue, pageURL); AttributePrincipal principal = assertion.getPrincipal(); String user = principal.getName(); Session session = getSession(); session.setAttribute(SSO_FLAG_AUTHENTICATED, Boolean.TRUE); session.setAttribute(SSO_USER_NAME, user); return true; } catch (TicketValidationException e) { getSession().invalidate(); } return false; }
/** * @return the url of this page as seen by the browser */ private String getPagePublicURL() { RequestCycle requestCycle = RequestCycle.get(); ServletWebRequest servletWebRequest = (ServletWebRequest) requestCycle.getRequest(); HttpServletRequest containerRequest = servletWebRequest.getContainerRequest(); String requestURL = containerRequest.getRequestURL().toString(); return requestURL; }
}