|
This document is an evolution of Drew Mazurek's Using CAS With Java HTML / Word document. It provides information about the Java Filter, JSP Tag, and core Java objects provided in the Java CAS Client. CAS FilterThe CAS filter is the simplest way of CAS-protecting your Java Servlets application. Configuring CASFilterJust a few lines of XML need to be added to your web application's deployment descriptor (web.xml): <web-app> ... <filter> <filter-name>CAS Filter</filter-name> <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <param-value>https://secure.its.yale.edu/cas/login</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> <param-value>https://secure.its.yale.edu/cas/serviceValidate</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <param-value>your server name and port (e.g., www.yale.edu:8080)</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Filter</filter-name> <url-pattern>/cas-protected/*</url-pattern> </filter-mapping> ... </web-app> In this case, any URL beneath /webapp/cas-protected would require a CAS login. If you want to protect your entire web application, you can simply put /* for the URL pattern: <filter-mapping> <filter-name>CAS Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> The serverName initialization parameter does not require a port number if you are using the standard HTTP port (80). You can specify other initialization parameters to configure the behavior of the filter: Required CASFilter init-params
Optional CASFilter init-params
Consuming the results of CASFilterOnce the user has logged into your application through the filter, the application may access the user's name through the session attribute, edu.yale.its.tp.cas.client.filter.user, or if you import edu.yale.its.tp.cas.client.filter.CASFilter in your JSP or servlet, simply CASFilter.CAS_FILTER_USER. Accessing the authenticated username from Java // either of these will work: session.getAttribute(CASFilter.CAS_FILTER_USER); session.getAttribute("edu.yale.its.tp.cas.client.filter.user"); Accessing the authenticated username via JSTL <c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>
Additionally, the client application may access a CASReceipt JavaBean-style object which exposes the username as well as additional information about the successful authentication, in the session attribute edu.yale.its.tp.cas.client.filter.receipt . // either of these will work: session.getAttribute(CASFilter.CAS_FILTER_RECEIPT); session.getAttribute("edu.yale.its.tp.cas.client.filter.receipt"); Session attributes set by CASFilter
Read more about CAS Filter behavior. CAS Tag LibraryThe CAS Tag Library is a another way to authenticate users' access to JSP pages. JSP Tags cannot be used in servlets, so if you need CAS protection within a servlet environment, you can use either the CAS Filter or the CAS Java objects (see below); the former is recommended. To use the tag library, once casclient.jar is installed in your web application's /WEB-INF/lib directory, you need to add the following to the top of a JSP page you wish to protect: <%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas" %> <cas:auth var="netID" scope="session"> <cas:loginUrl>https://secure.its.yale.edu/cas/login</cas:loginUrl> <cas:validateUrl>https://secure.its.yale.edu/cas/proxyValidate</cas:validateUrl> <cas:authorizedProxy>https://authorized-proxy1</cas:authorizedProxy> <cas:authorizedProxy>https://authorized-proxy2</cas:authorizedProxy> ... <cas:service>http://service-url</cas:service> </cas:auth> ... <html> <body> <p>Welcome, <%= session.getAttribute("netID") %>!</p> </body> </html> The user will not see any part of the page past the <cas:auth /> tags until he/she has logged in. If the user hasn't logged in yet, a redirect to the CAS login page will be performed. Also provided with the CAS Tag Library is a logout tag: <%@ taglib uri="http://www.yale.edu/its/tp/cas/version2" prefix="cas" %> <%-- first destroy the web application's session --%> <% session.invalidate(); %> <%-- then logout of CAS --%> <cas:logout var="netID" scope="session" logoutUrl="https://secure.its.yale.edu/cas/logout" /> CAS Java ObjectsYou may also authenticate users "manually" using the CAS Java objects. In this case, you would instantiate a new ServiceTicketValidator or ProxyTicketValidator. Notice that in the example below, the page already expects to receive a ticket parameter (this is the servlet that CAS returned to after the user logged in). If this servlet was accessed directly by a user, it would need to check that the request parameter, ticket, was not null. If it was null, the servlet would need to redirect to the CAS login page manually. ServiceTicketValidator:import edu.yale.its.tp.cas.client.*; ... String user = null; String errorCode = null; String errorMessage = null; String xmlResponse = null; /* instantiate a new ServiceTicketValidator */ ServiceTicketValidator sv = new ServiceTicketValidator(); /* set its parameters */ sv.setCasValidateUrl("https://secure.its.yale.edu/cas/serviceValidate"); sv.setService(urlOfThisService); sv.setServiceTicket(request.getParameter("ticket")); /* * If we want to be able to acquire proxy tickets (requires callback servlet to be set up * in web.xml - see below) */ String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet"; sv.setProxyCallbackUrl(urlOfProxyCallbackServlet); /* 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 */ } /* The user is now authenticated. */ /* If we did set the proxy callback url, we can get proxy tickets with: */ String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed"; String proxyTicket = edu.yale.its.tp.cas.proxy.ProxyTicketReceptor.getProxyTicket( sv.getPgtIou(),urlOfTargetService); ProxyTicketValidatorThe proxy ticket validator is almost identical, except it allows you to validate service tickets or proxy tickets. This class contains one additional method, getProxyList(), which accesses the list of URLs through which the authentication was proxied. import edu.yale.its.tp.cas.client.*; ... String user = null; String errorCode = null; String errorMessage = null; String xmlResponse = null; List proxyList = null; /* instantiate a new ProxyTicketValidator */ ProxyTicketValidator pv = new ProxyTicketValidator(); /* set its parameters */ pv.setCasValidateUrl("https://secure.its.yale.edu/cas/proxyValidate"); pv.setService(urlOfThisService); pv.setServiceTicket(request.getParameter("ticket")); /* * If we want to be able to acquire proxy tickets (requires callback servlet to be set up * in web.xml -- see below) */ String urlOfProxyCallbackServlet = "https://portal.yale.edu/CasProxyServlet"; pv.setProxyCallbackUrl(urlOfProxyCallbackServlet); /* contact CAS and validate */ pv.validate(); /* if we want to look at the raw response, we can use getResponse() */ xmlResponse = pv.getResponse(); /* read the response */ // Yes, this method is misspelled in this way // in the ServiceTicketValidator implementation. // Sorry. if(pv.isAuthenticationSuccesful()) { user = pv.getUser(); proxyList = pv.getProxyList(); } else { errorCode = pv.getErrorCode(); errorMessage = pv.getErrorMessage(); /* handle the error */ } /* The user is now authenticated. */ /* If we did set the proxy callback url, we can get proxy tickets with this method call: */ String urlOfTargetService = "http://hkg2.its.yale.edu/someApp/portalFeed"; String proxyTicket = edu.yale.its.tp.cas.proxy.ProxyTicketReceptor.getProxyTicket( pv.getPgtIou(),urlOfTargetService); ProxyTicketReceptorIn order to obtain proxy tickets, the proxy callback listener must be set up as a servlet in the application's web.xml: <web-app> ... <servlet> <servlet-name>ProxyTicketReceptor</servlet-name> <servlet-class>edu.yale.its.tp.cas.proxy.ProxyTicketReceptor</servlet-class> </servlet> <servlet-mapping> <servlet-name>ProxyTicketReceptor</servlet-name> <url-pattern>/CasProxyServlet</url-pattern> </servlet-mapping> ... </webapp> |
