2012-10-10 85 views
2

我在我的應用程序中實現了jasig-CAS,但現在我想知道更多。 是否可以做我自己的登錄頁面,然後它會自動(在後臺)對CAS中的用戶進行身份驗證。 這樣的步驟是下一個:使用CAS與自定義登錄頁

  1. 用戶進入登錄頁面
  2. 用戶輸入其憑據
  3. 如果驗證成功,用戶的憑據發送到CAS,從而CAS在其系統驗證的用戶,並給出了票(用戶不會看到任何CAS頁)
  4. 用戶訪問受保護的頁面

感謝。

回答

1

您可以使用REST API。 CAS REST

我在登錄時使用它,即Drupal。由於您沒有重定向,用戶沒有看到任何CAS頁面。

這樣的步驟將是:

  1. 用戶進入登錄頁面。
  2. 用戶輸入crendetials。
  3. 您的應用程序通過REST將用戶名和密碼發佈到CAS。
  4. 您的應用程序在成功驗證後會獲得票證授予票證。

此時您可以登錄他到你的應用程序(他已經登錄到CAS)或驗證你接收。然後登錄了他的票。

0
  1. 我想你需要得到一份拷貝CAS官方客戶端源代碼(cas-client-core),並確保您可以編譯它。

  2. 您需要在客戶端源代碼中的org.jasig.cas.client.authentication.AuthenticationFilter處更改doFilter()函數代碼,如下所示。

    final HttpServletRequest request = (HttpServletRequest) servletRequest; 
    final HttpServletResponse response = (HttpServletResponse) servletResponse; 
    final HttpSession session = request.getSession(false); 
    final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null; 
    
    if(request.getServletPath().toLowerCase().equals("/caslogout.jsp")) 
    { 
        // Set the custom client login page when you logout from CAS server. 
        request.setAttribute("casServerLogoutUrl",casServerLoginUrl.replace("login","logout")); 
        request.setAttribute("customServerLoginUrl",customServerLoginUrl); 
    
        //We must remove the attribute of CONST_CAS_ASSERTION manually 
        if(session!=null) 
         session.removeAttribute(CONST_CAS_ASSERTION); 
    
        filterChain.doFilter(request, response); 
        return; 
    } 
    
    if (assertion != null) { 
        filterChain.doFilter(request, response); 
        return; 
    } 
    
    // Although the custom login page must called caslogin, here you can change it. 
    if(request.getServletPath().toLowerCase().equals("/caslogin.jsp")) 
    { 
        //Set the a default parameter to the caslogin 
        request.setAttribute("defaultServerIndexUrl",defaultServerIndexUrl); 
        request.setAttribute("casServerLoginUrl",casServerLoginUrl); 
        filterChain.doFilter(request, response); 
        return; 
    } 
    
    final String serviceUrl = constructServiceUrl(request, response); 
    final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName()); 
    final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl); 
    
    if (CommonUtils.isNotBlank(ticket) || wasGatewayed) { 
        filterChain.doFilter(request, response); 
        return; 
    } 
    
    final String modifiedServiceUrl; 
    
    log.debug("no ticket and no assertion found"); 
    if (this.gateway) { 
        log.debug("setting gateway attribute in session"); 
        modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl); 
    } else { 
        modifiedServiceUrl = serviceUrl; 
    } 
    
    if (log.isDebugEnabled()) { 
        log.debug("Constructed service url: " + modifiedServiceUrl); 
    } 
    
    final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway); 
    
    if (log.isDebugEnabled()) { 
        log.debug("redirecting to \"" + urlToRedirectTo + "\""); 
    } 
    
    // Add a custom server login url parameter to the CAS login url. 
    response.sendRedirect(urlToRedirectTo+"&customLogin=custom&customLoginPage="+customServerLoginUrl); 
    
  3. 自己編譯的CAS客戶端核心添加到您的客戶端Web應用程序的依賴。

  4. 將caslogin.jsp添加到您的客戶端Web應用程序。

 <form method="GET" action="<%=request.getAttribute("casServerLoginUrl")%>"> 
 
    <p>Username : <input type="text" name="username" /></p> 
 
    <p>Password : <input type="password" name="password" /></p> 
 
    <p><input type="submit" value="Login" /></p> 
 
    <input type="hidden" name="auto" value="true" /> 
 
    <input type="hidden" name="service" value="<%=request.getParameter("service")==null?request.getAttribute("defaultServerIndexUrl"):request.getParameter("service")%>" />

  • 編輯在客戶端應用中web.xml。添加以下代碼中CASFilter
  • 的濾波器

    <init-param> 
     
        <param-name>defaultServerIndexUrl</param-name> 
     
        <param-value>http://clientip:port/webappname/index.jsp</param-value> 
     
    </init-param> 
     
    <init-param> 
     
        <param-name>customServerLoginUrl</param-name> 
     
        <param-value>http://clientip:port/webappname/caslogin.jsp</param-value> 
     
    </init-param>

  • 編輯在CAS-服務器的web應用的代碼/ WEB-INF /視圖/ JSP/CAS服務器Web應用程序中的默認/ ui/casLoginView.jsp。
  • <% 
     
        String auto=request.getParameter("auto"); 
     
        String customLogin=request.getParameter("customLogin"); 
     
    
     
        if(auto!=null&&auto.equals("true")) 
     
        { 
     
        %> 
     
        <html> 
     
        <head> 
     
         <script language="javascript"> 
     
         function doAutoLogin() 
     
         { 
     
          document.forms[0].submit(); 
     
         } 
     
         </script> 
     
        </head> 
     
        <body onload="doAutoLogin()"> 
     
        <form id="credentials" method="POST" action="<%=request.getContextPath()%>/login?service=<%=request.getParameter("service")%>"> 
     
         <input type="hidden" name="lt" value="${loginTicket}" /> 
     
         <input type="hidden" name="execution" value="${flowExecutionKey}" /> 
     
         <input type="hidden" name="_eventId" value="submit" /> 
     
         <input type="hidden" name="username" value="<%=request.getParameter("username")%>" /> 
     
         <input type="hidden" name="password" value="<%=request.getParameter("password")%>" /> 
     
         <input type="hidden" name="login_form" value="<%=request.getParameter("login_form")%>" /> 
     
         <input type="hidden" name="rememberMe" value="true" /> 
     
         <input type="submit" value="Submit" style="visibility: hidden" /> 
     
        </form> 
     
        </body> 
     
        </html> 
     
    
     
        <% 
     
    } 
     
    else if(customLogin!=null&&customLogin.equals("custom")) 
     
    { 
     
        response.sendRedirect(request.getParameter("customLoginPage")+"?service="+request.getParameter("service")); 
     
    %> 
     
    <% 
     
    } 
     
    else 
     
    {%> 
     
    <!-- The Orgin Source Code of casLoginView.jsp!!!!!!!!!!!!!!!!!!!!!!!!! --> 
     
    <%}%>

  • 現在你可以登錄用自己的caslogin.jsp CAS!
  • 我還提供了一個關於如何使用客戶端自定義登錄屏幕而不是服務器登錄srceen登錄cas的示例。你可以下載它
    https://github.com/yangminxing/cas-custom-login-page

    0

    如果您不需要SSO,然後是你可以像rexposadas表示,採用CAS REST。 下面是一個很好的java示例:http://www.bmchild.com/2014/05/a-simple-cas-java-rest-client-example.html

    但是這不適用於SSO,換句話說,您將無法在appA中登錄,然後在appB中自動登錄。這是因爲cas登錄頁面創建了用於SSO的TGT cookie。通過REST,你不會得到創建的cookie。

    但是,如果你不需要SSO,那麼CAS REST就可以做到。