使用CAS与自定义登录页面

时间:2012-10-10 10:05:10

标签: java spring spring-security cas

我在我的应用程序中实现了jasig-CAS,但现在我想知道更多。 是否可以执行我自己的登录页面,然后它会自动(在后台)对CAS中的用户进行身份验证。 所以步骤如下:

  1. 用户转到登录页面
  2. 用户输入他的凭据
  3. 如果身份验证成功,用户的凭据将发送到CAS,因此CAS会对其系统中的用户进行身份验证并提供故障单(用户不应看到任何CAS页面)
  4. 用户访问受保护的页面
  5. 感谢。

5 个答案:

答案 0 :(得分:1)

您可以使用REST API。 CAS REST

我用它来登录,即Drupal。由于您没有重定向用户,因此未看到任何CAS页面。

所以步骤将是:

  1. 用户进入登录页面。
  2. 用户输入crendetials。
  3. 您的应用程序通过REST将用户名和密码发布到CAS。
  4. 您的应用程序在成功验证后会获得票证授予票证。
  5. 此时您可以将他登录到您的应用程序(他已经登录CAS)或验证您收到的票证然后登录。

答案 1 :(得分: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-client-core添加到客户端webapp的依赖项中。

  4. 将caslogin.jsp添加到您的客户端webapp。

  5. 
    
         <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")%>" />
    &#13;
    &#13;
    &#13;

    1. 在客户端webapp中编辑web.xml。在CASFilter过滤器中添加以下代码
    2. &#13;
      &#13;
      <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>
      &#13;
      &#13;
      &#13;

      1. 编辑CAS服务器Web应用程序中cas-server-webapp / WEB-INF / view / jsp / default / ui / casLoginView.jsp的代码。
      2. &#13;
        &#13;
        <%
          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!!!!!!!!!!!!!!!!!!!!!!!!! -->
        <%}%>
        &#13;
        &#13;
        &#13;

        1. 现在您可以使用自己的caslogin.jsp登录cas!
        2. 我还提供了一个关于如何使用客户端自定义登录屏幕而不是服务器登录srceen登录cas的示例。你可以下载它
          https://github.com/yangminxing/cas-custom-login-page

答案 2 :(得分: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就可以了。

答案 3 :(得分:0)

更新的CAS文档有一个关于用户界面自定义的页面:

https://apereo.github.io/cas/4.2.x/installation/User-Interface-Customization.html

请注意,自原始帖子和其他一些答案以来,CAS网站和文档已经移动。

CAS主页 - https://apereo.github.io/cas/4.2.x/index.html

CAS on Github - https://github.com/apereo/cas

Legacy CAS Wiki - https://wiki.jasig.org/display/CAS/Home

答案 4 :(得分:0)

建议不要使用外部表单输入凭据,并扩大攻击面。见https://apereo.github.io/cas/5.0.x/planning/Security-Guide.html

如果有人违反了您的外部表格申请,攻击者就可以访问所有与SSO相关的系统。