1.本示例中使用cas4.0+cas-client-core3.4版本,ide則是myeclipse2014 blue版本,mvn使用3.9版本css
2.注意事項:請先實現破解cas-client-core,https請求證書的限制html
3.在pom.xml引入cas-client-core.jar,並用破解版替換mvn倉庫版本java
4.web.xml配置web
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>cas-client-demo</display-name> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> <!--SSO認證根地址--> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://xxx.cn:7143/cas</param-value> </init-param> </filter> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Authentication Filter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <!--SSO登陸地址--> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://xxx.cn:7143/cas/login</param-value> </init-param> <!--本系統根地址--> <init-param> <param-name>serverName</param-name> <param-value>https://localhost:7143</param-value> </init-param> <init-param> <description>不攔截的請求</description> <param-name>ignorePattern</param-name> <param-value>/js/*|/img/*|/view/*|/css/*|/sys/*</param-value> </init-param> </filter> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://xxx.cn:7143/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>https://localhost:7143</param-value> </init-param> <init-param> <param-name>redirectAfterValidation</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>useSession</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!-- <init-param> <param-name>acceptAnyProxy</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>proxyReceptorUrl</param-name> <param-value>/sample/proxyUrl</param-value> </init-param> <init-param> <param-name>proxyCallbackUrl</param-name> <param-value>https://mmoayyed.unicon.net:9443/sample/proxyUrl</param-value> </init-param> --> <init-param> <param-name>authn_method</param-name> <param-value>mfa-duo</param-value> </init-param> </filter> <!--SSO退出地址--> <context-param> <param-name>casServerLogoutUrl</param-name> <param-value>https://xxx.cn:7143/cas/logout</param-value> </context-param> <!--本系統根地址--> <context-param> <param-name>serverName</param-name> <param-value>https://localhost:7143</param-value> </context-param> <filter> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <filter> <filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <!-- 本地默認登錄頁面 --> <welcome-file>sys/index.jsp</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
5.webapp目錄新建home,sys文件夾session
5.1sys文件夾添加index.jsp文件app
代碼以下框架
<%@page contentType="text/html;charset=UTF-8" %> <%@page pageEncoding="UTF-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>CAS-Demo-不須要認證界面</title> </head> <body> <p> 本頁面內可完成自定義登陸功能 </p> </body> </html>
5.2home添加index.jsp,代碼以下eclipse
<%@page contentType="text/html;charset=UTF-8" %> <%@page pageEncoding="UTF-8" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.Iterator" %> <%@ page import="java.util.List" %> <%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>CAS-Demo</title> </head> <body> <h3>Cas-Client接入示例.</h3> <hr> <p> <b>用戶:<%= request.getRemoteUser() %></b> <% //此處默認使用了單點退出,實際操做根據實際的項目框架特色來調整,思路參考SignOut.jsp %> <a href="logout.jsp" title="退出">退出</a> </p> <% if (request.getUserPrincipal() != null) { AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); final Map attributes = principal.getAttributes(); if (attributes != null) { Iterator attributeNames = attributes.keySet().iterator(); out.println("<b>Attributes:</b>"); if (attributeNames.hasNext()) { out.println("<hr><table border='3pt' width='100%'>"); out.println("<th colspan='2'>Attributes</th>"); out.println("<tr><td><b>Key</b></td><td><b>Value</b></td></tr>"); for (; attributeNames.hasNext(); ) { out.println("<tr><td>"); String attributeName = (String) attributeNames.next(); out.println(attributeName); out.println("</td><td>"); final Object attributeValue = attributes.get(attributeName); if (attributeValue instanceof List) { final List values = (List) attributeValue; out.println("<strong>Multi-valued attribute: " + values.size() + "</strong>"); out.println("<ul>"); for (Object value : values) { out.println("<li>" + value + "</li>"); } out.println("</ul>"); } else { out.println(attributeValue); } out.println("</td></tr>"); } out.println("</table>"); } else { out.print("No attributes are supplied by the CAS server.</p>"); } } else { out.println("<pre>The attribute map is empty. Review your CAS filter configurations.</pre>"); } } else { out.println("<pre>The user principal is empty from the request object. Review the wrapper filter configuration.</pre>"); } %> </body> </html>
5.3home添加logout.jspwebapp
<%@page contentType="text/html" %> <%@page pageEncoding="UTF-8" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.Iterator" %> <%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %> <% //斷定退出類型 Boolean isSsoLogout=true; if(isSsoLogout){ //單點退出模式 //本地退出操做模擬 session.invalidate(); //調用單點退出接口 response.sendRedirect(application.getInitParameter("casServerLogoutUrl")+ "?service=" + application.getInitParameter("serverName") + "/cas-client-demo-1/home"); } else{ //本地退出模式 //本地退出操做模擬 session.invalidate(); //跳轉至本地登陸頁/ty/login.jsp response.sendRedirect("/ty/login.jsp"); } %>
5.4webapp下面添加index.jsp頁面jsp
<%@page contentType="text/html;charset=UTF-8" %> <%@page pageEncoding="UTF-8" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.Iterator" %> <%@ page import="java.util.List" %> <%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %> <% response.sendRedirect("/home"); %>
6.運行結果
sys/index.jsp頁面不須要認證就能夠進入
系統默認頁面路徑:sys/index.jsp
home以及其餘訪問路徑下的請求須要認證