CAS自定义登录

基于cas3.5.2 sever改造而成。


通过子系统页面登录:









领御教育云 - 首页




 




平台登录

cas sever增加两个类:

package com.denger.sso.util;

public class CasUtility {  
	  
    /** 
     * Removes the previously attached GET parameters "lt" and "error_message" 
     * to be able to send new ones. 
     *  
     * @param casUrl 
     * @return 
     */  
    public static String resetUrl(String casUrl) {  
        String cleanedUrl;  
        String[] paramsToBeRemoved = new String[] { "lt", "error_message", "get-lt" };  
        cleanedUrl = removeHttpGetParameters(casUrl, paramsToBeRemoved);  
        return cleanedUrl;  
    }  
  
    /** 
     * Removes selected HTTP GET parameters from a given URL 
     *  
     * @param casUrl 
     * @param paramsToBeRemoved 
     * @return 
     */  
    public static String removeHttpGetParameters(String casUrl,  
            String[] paramsToBeRemoved) {  
        String cleanedUrl = casUrl;  
        if (casUrl != null) {  
            // check if there is any query string at all  
            if (casUrl.indexOf("?") == -1) {  
                return casUrl;  
            } else {  
                // determine the start and end position of the parameters to be  
                // removed  
                int startPosition, endPosition;  
                boolean containsOneOfTheUnwantedParams = false;  
                for (String paramToBeErased : paramsToBeRemoved) {  
                    startPosition = -1;  
                    endPosition = -1;  
                    if (cleanedUrl.indexOf("?" + paramToBeErased + "=") > -1) {  
                        startPosition = cleanedUrl.indexOf("?"  
                                + paramToBeErased + "=") + 1;  
                    } else if (cleanedUrl.indexOf("&" + paramToBeErased + "=") > -1) {  
                        startPosition = cleanedUrl.indexOf("&"  
                                + paramToBeErased + "=") + 1;  
                    }  
                    if (startPosition > -1) {  
                        int temp = cleanedUrl.indexOf("&", startPosition);  
                        endPosition = (temp > -1) ? temp + 1 : cleanedUrl  
                                .length();  
                        // remove that parameter, leaving the rest untouched  
                        cleanedUrl = cleanedUrl.substring(0, startPosition)  
                                + cleanedUrl.substring(endPosition);  
                        containsOneOfTheUnwantedParams = true;  
                    }  
                }  
  
                // wenn nur noch das Fragezeichen vom query string 鈭毬篵rig oder am  
                // schluss ein "&", dann auch dieses entfernen  
                if (cleanedUrl.endsWith("?") || cleanedUrl.endsWith("&")) {  
                    cleanedUrl = cleanedUrl.substring(0,  
                            cleanedUrl.length() - 1);  
                }  
                // parameter mehrfach angegeben wurde...  
                if (!containsOneOfTheUnwantedParams)  
                    return casUrl;  
                else  
                    cleanedUrl = removeHttpGetParameters(cleanedUrl,  
                            paramsToBeRemoved);  
            }  
        }  
        return cleanedUrl;  
    }
}

package com.denger.sso.web;

import javax.servlet.http.HttpServletRequest;

import org.jasig.cas.web.support.WebUtils;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;

public class ProvideLoginTicketAction extends AbstractAction{  
	  


	@Override
	protected Event doExecute(RequestContext context) throws Exception {
		 final HttpServletRequest request = WebUtils.getHttpServletRequest(context);  
		 if (request.getParameter("get-lt") != null && request.getParameter("get-lt").equalsIgnoreCase("true")) {  
	            return result("loginTicketRequested");  
	        }  
	        return result("continue");  
	}  
      
}  

修改源码org.jasig.cas.web.flow.AuthenticationViaFormAction 中的submit方法:

        try {  
            WebUtils.putTicketGrantingTicketInRequestScope(context, this.centralAuthenticationService.createTicketGrantingTicket(credentials));  
            putWarnCookieIfRequestParameterPresent(context);  
            return "success";  
        } catch (final TicketException e) {  
            populateErrorsInstance(e, messageContext);  
            // 当验证失败后,判断参数中是否获否 login-at 参数,如果包含的话则跳转至 login ticket 获取页  
            String referer = context.getRequestParameters().get("login-at");  
            if (!org.apache.commons.lang.StringUtils.isBlank(referer)) {  
                return "errorForRemoteRequestor";  
            }  
            return "error";  
        }
修改cas-servelt增加以下代码:

修改deployerConfigContext.xml,换成我自己写的数据库验证:

注释掉 
换成: (并将自己写的验证authentication.jar包放入lib中)

修改login-webflow.xml,在initialFlowSetupAction下面增加如下代码:

    
        
        
        
    
  
    
        
        
            
            
        
        
            
        
        
            
            
        
    

再建一个数据库配置文件extend.properties:

#=====DATABASE SETTING=======
mysql-driver=com.mysql.jdbc.Driver
mysql-url=jdbc:mysql://127.0.0.1:3306/portal
mysql-user=root
mysql-password=123456


最后在view\jsp\default\ui 下增加获取lt  的 viewRedirectToRequestor.jsp页面:

<%@ page contentType="text/html; charset=UTF-8"%>  
<%@ page import="com.denger.sso.util.CasUtility"%>  
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>  
<%  
    String separator = "";  
        // 需要输入 login-at 参数,当生成lt后或登录失败后则重新跳转至 原登录页,并传入参数 lt 和 error_message  
    String referer = request.getParameter("login-at");  
  
    referer = CasUtility.resetUrl(referer);  
    if (referer != null && referer.length() > 0) {  
        separator = (referer.indexOf("?") > -1) ? "&" : "?";  
%>  
  
    cas get login ticket  
      
          
          
      
      
  
<%  
    } else {  
%>         
          
<%         
    }  
%> 







你可能感兴趣的:(cas)