`
01jiangwei01
  • 浏览: 542941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cas 系统实例 服务端配置(二) 自定义登录

    博客分类:
  • cas
 
阅读更多

学习一下,自定义登录

在web.xml中增加remoteLogin,例如:

<servlet-mapping>
<servlet-name>cas</servlet-name>
<url-pattern>/myRemoteLogin</url-pattern>
</servlet-mapping>

 在cas-servlet.xml 中增加新的bean并添加相应的映射

<webflow:flow-registry id="flowRegistry" flow-builder-services="builder">
        <webflow:flow-location path="/WEB-INF/login-webflow.xml" id="login" />
        <webflow:flow-location path="/WEB-INF/mylogin-webflow.xml" id="myRemoteLogin" />
    </webflow:flow-registry>
<bean id="remoteLoginAction"
                class="org.jasig.cas.web.my.login.RemoteLoginAction"
            p:argumentExtractors-ref="argumentExtractors"
            p:warnCookieGenerator-ref="warnCookieGenerator"
            p:centralAuthenticationService-ref="centralAuthenticationService"
            p:initialFlowSetupAction-ref="initialFlowSetupAction"
            p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
            />
<bean id="generateResponse" class="org.jasig.cas.web.my.login.GenerateResponse"></bean>
 

mylogin-webflow.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

	
    <!-- 开始 -->
    <on-start>
    	<!-- 定义执行方法  到数据库相关验证 -->
        <evaluate expression="remoteLoginAction" />
    </on-start>
    
    <!-- 判断是否有错误 -->
    <decision-state id="hasError">
		<if test="flowScope.error neq null  &amp;&amp; flowScope.error neq '' " then="hasfailPageCheck" else="sendTicketGrantingTicket" />
	</decision-state>
	<!-- 取得错误信息,及返回页面 -->
	<action-state id="hasfailPageCheck">
        <evaluate 
        expression="generateResponse.getResponse( flowRequestContext,true)" 
        result-type="org.jasig.cas.authentication.principal.Response" 
        result="flowScope.response" />
        <transition to="postView" />
    </action-state> 
	<action-state id="sendTicketGrantingTicket">
        <evaluate expression="sendTicketGrantingTicketAction" />
		<transition to="serviceCheck" />
	</action-state>
	<decision-state id="serviceCheck">
		<if test="flowScope.service neq null" then="generateServiceTicket" else="viewGenericLoginSuccess" />
	</decision-state>
	
	
	<!-- 产生service票据 -->
	<action-state id="generateServiceTicket">
        <evaluate expression="generateServiceTicketAction" />
		<transition on="success" to ="getReturnResponse" /> 
		<transition on="gateway" to="hasError" />
	</action-state>
	
	
	<!-- 取得正常返回,及返回页面 -->
	<action-state id="getReturnResponse">
        <evaluate 
        expression="generateResponse.getResponse( flowRequestContext,false)" 
        result-type="org.jasig.cas.authentication.principal.Response" 
        result="flowScope.response" />
        <transition to="redirectView" />
    </action-state>
	
	<end-state id="postView" view="postResponseView">
        <on-entry>
            <set name="requestScope.parameters" value="flowScope.response.attributes" />
            <set name="requestScope.originalUrl" value="flowScope.response.url" />
        </on-entry>
    </end-state>
    <end-state id="viewGenericLoginSuccess" view="casLoginGenericSuccessView" />
    <end-state id="redirectView" view="externalRedirect:http://localhost:8081/casclient4/sso/index.jsp" />
    
    <global-transitions>
		<transition to="viewServiceErrorView" on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException" />
        <transition to="viewServiceSsoErrorView" on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />
		<transition to="viewServiceErrorView" on-exception="org.jasig.cas.services.UnauthorizedServiceException" />
	</global-transitions>

	
</flow>

 RemoteLoginAction.java

package org.jasig.cas.web.my.login;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotEmpty;
import org.jasig.cas.CentralAuthenticationService;
import org.jasig.cas.authentication.principal.Credentials;
import org.jasig.cas.authentication.principal.Service;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.jasig.cas.ticket.TicketException;
import org.jasig.cas.web.flow.InitialFlowSetupAction;
import org.jasig.cas.web.support.ArgumentExtractor;
import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.util.StringUtils;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;

/**
* 远程登陆票据提供Action.
* 根据InitialFlowSetupAction修改.
* 由于InitialFlowSetupAction为final类,因此只能将代码复制过来再进行修改.
* 
* @author GuoLin
*/
public class RemoteLoginAction extends AbstractAction {
    /** CookieGenerator for the Warnings. */
    @NotNull
    private CookieRetrievingCookieGenerator warnCookieGenerator;
   
    /** Extractors for finding the service. */
    @NotEmpty
    private List<ArgumentExtractor> argumentExtractors;
     
    
    /** Core we delegate to for handling all ticket related tasks. */
    @NotNull
    private CentralAuthenticationService centralAuthenticationService;
    
 	@NotNull
    private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;
    
    private InitialFlowSetupAction initialFlowSetupAction;
    
    protected Event doExecute(final RequestContext context)   {
        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
    	
        /***
         * 必须的
         */
        context.getFlowScope().put( "warnCookieValue", Boolean.valueOf(this.warnCookieGenerator.retrieveCookieValue(request)));
        
        
    	String uName = request.getParameter("username");
    	String password = request.getParameter("password");
    	
    	
    	Credentials credentials =new UsernamePasswordCredentials(uName,password);
    	if (!this.initialFlowSetupAction.pathPopulated) {
            final String contextPath = request.getContextPath();
            final String cookiePath = StringUtils.hasText(contextPath) ? contextPath + "/" : "/";
            logger.info("Setting path for cookies to: "
                + cookiePath);
            this.warnCookieGenerator.setCookiePath(cookiePath);
            this.ticketGrantingTicketCookieGenerator.setCookiePath(cookiePath);
            this.initialFlowSetupAction.pathPopulated = true;
        }
    	
    	context.getFlowScope().put("credentials", credentials);
    	
    	 
    	String createTicketGrantingTicket;
		try {
			createTicketGrantingTicket = this.centralAuthenticationService.createTicketGrantingTicket(credentials);
			/***
			 * 必须的
			 */
			 WebUtils.putTicketGrantingTicketInRequestScope(context,createTicketGrantingTicket );
		} catch (TicketException e) {
			context.getFlowScope().put("error", "error.userOrPassword.error");
			e.printStackTrace();
		}
    	 
        // putWarnCookieIfRequestParameterPresent(context);
         
         
         final Service service = WebUtils.getService(this.argumentExtractors,  context);
             

         if (service != null && logger.isDebugEnabled()) {
             logger.debug("Placing service in FlowScope: " + service.getId());
         }

          context.getFlowScope().put("service", service);
    	
        return result("submit");
    }
    
    public void setWarnCookieGenerator(final CookieRetrievingCookieGenerator warnCookieGenerator) {
        this.warnCookieGenerator = warnCookieGenerator;
    }
    public void setArgumentExtractors(
        final List<ArgumentExtractor> argumentExtractors) {
        this.argumentExtractors = argumentExtractors;
    }
    public final void setCentralAuthenticationService(final CentralAuthenticationService centralAuthenticationService) {
        this.centralAuthenticationService = centralAuthenticationService;
    }
    
	public void setInitialFlowSetupAction(
			InitialFlowSetupAction initialFlowSetupAction) {
		this.initialFlowSetupAction = initialFlowSetupAction;
	}
	 public void setTicketGrantingTicketCookieGenerator(
	            final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) {
	            this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator;
	        }
    
}

 GenerateResponse.java

package org.jasig.cas.web.my.login;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.jasig.cas.authentication.principal.Response;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.webflow.execution.RequestContext;

public class GenerateResponse {
	 public Response getResponse( final RequestContext context,boolean haveError) {
		 	String orgUrl = "";

		 	final Map<String, String> parameters = new HashMap<String, String>();
		 	
		 	
	        final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
	        if(haveError)
	        {
	        	orgUrl =request.getParameter("failpae");
	        	String error = (String) context.getFlowScope().get("error");
	        	parameters.put("error", error);
	        	parameters.put("result", "false");
	        }else
	        {
	        	orgUrl =request.getParameter("service");
	        	parameters.put("result", "true");
	        }
	        context.getFlowScope().put("responseUrl", orgUrl);
 
	        Response ret =  Response.getRedirectResponse(orgUrl, parameters);
	        
	        return ret;
	    }

}

 客户端端方法:

<form id="myLoginForm" action="http://localhost:8081/casserver/myRemoteLogin" method="post">
            <input type="hidden" id="targetService" name="service" value="http://localhost:8081/casclient4/sso/index.jsp">
            <input type="hidden" name="failpae" value="http://localhost:8081/casclient4/index.jsp">

 
            <table>
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>密&nbsp;&nbsp;码:</td>
                    <td><input type="password" name="password"></td>
                </tr>
                <tr><td>验证码</td>
                <td><input type="text" /><img
									src="http://localhost:8081/casserver/random"
									class="sign_img fl mt5"  /></td></tr>
                <tr>
                    <td colspan="2"><input type="submit" value="登陆" /></td>
                </tr>
                
            </table>
        </form>
 

 

分享到:
评论
4 楼 xiaobadi 2014-10-30  
你每次登陆都是跳到http://localhost:8081/casclient4/sso/index.jsp。如果有多个客户端就有问题了吧
3 楼 Han_Zhou 2013-09-28  
确实不行啊,可否发送一份配置好了的cas-server给我asher_sys@163.com
2 楼 01jiangwei01 2012-06-05  
配合着几个可以登录运行啊。
1 楼 snowspice 2012-05-29  
这个能正常运行吗?我试了下,不行呀

相关推荐

    cas 系统实例 服务端配置(一)

    标题 "cas 系统实例 服务端配置(一)" 提到的是 CAS(Central Authentication Service)系统的一个服务端配置教程。CAS 是一个开源的身份验证框架,主要用于实现单一登录(Single Sign-On, SSO)。在本教程中,我们...

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) http://blog.csdn.net/ae6623/article/details/8851801 [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas...

    cas服务端和客户端可用代码

    CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个统一的身份验证入口点登录,然后在多个应用系统间自由切换,而无需再次进行身份验证。这个给定的...

    cas实现单点登录服务端及客户端

    SSO允许用户通过一次登录验证就能访问多个应用系统,无需在每个系统之间单独进行身份验证,极大地提高了用户体验和安全性。本教程将深入探讨如何使用CAS实现服务端和客户端的集成。 1. CAS服务端搭建 - 安装环境:...

    cas单点登录代码例子 有文档 服务端客户端例子 亲测可用

    在这个压缩包中,包含了一个CAS服务端和客户端的代码实例,以及相关的配置文档,可以帮助开发者快速理解和实现CAS SSO功能。 服务端部分(cas-server-4.0.0-release.rar): CAS服务端是整个SSO的核心,它负责验证...

    Spring Security集成CAS客户端实例

    在实际应用中,开发者需要根据项目需求调整配置,比如自定义登录页面、增加权限控制、处理异常情况等。这个实例提供了一个基础的SSO解决方案,帮助开发者理解Spring Security和CAS的集成机制,并在此基础上进行扩展...

    利用CAS实现单点登录的完整实例

    总结,通过学习和实践这个"利用CAS实现单点登录的完整实例",你将掌握如何使用Jasig CAS构建一个高效的单点登录系统,从而提升用户体验,简化身份验证管理,并加强系统的安全性。记得深入理解每个步骤,并根据实际...

    cas结合 springmvc shiro 单点登录

    1. **CAS服务端配置**:首先,我们需要搭建CAS服务器,这通常涉及安装CAS服务器软件,配置服务器端的认证逻辑,例如数据库连接以验证用户凭证。 2. **CAS客户端配置**:然后,我们需要在SpringMVC应用中配置CAS...

    cas-server.zip

    "cas-server.zip" 文件是一个包含CAS服务端的小型演示项目,用于展示如何配置和自定义CAS服务器。 1. **CAS服务端**: CAS服务器是整个SSO体系的核心,负责用户的身份验证。在这个小demo中,你可以看到如何搭建和...

    yale-cas服务器端深度定制

    【标题】"Yale CAS服务器端深度定制"主要涉及到的是CAS(Central Authentication Service)系统,这是一个基于Java开发的开源身份验证框架,由耶鲁大学开发并广泛应用于各个机构的单点登录(Single Sign-On,SSO)...

    CAS单点登录 for Tomcat

    在提供的文档中,如《安装配置CAS实现单点登录 (v1.0).doc》和《SSO实例安装和配置指南.pdf》,通常会详细介绍每一步的具体操作和注意事项,包括版本兼容性、配置示例和常见问题解答。《CAS_Tomcat6.doc》可能专注于...

    cas改改可以用了

    CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个统一的身份验证入口点登录,然后在多个应用系统之间共享该身份验证信息,无需再次登录。"cas改改...

    单点登录实例spring ws 2.0

    单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。在这个实例中,我们关注的是如何使用Spring WS 2.0来实现SSO。Spring WS是Spring框架的一...

    代码编程 Java 中高级难度 笔试题(附答案)

    - 用户自定义类加载器:允许开发者自定义类加载策略。 3. **垃圾收集机制(GC)** - **目的**:自动回收不再使用的对象所占用的内存空间。 - **不同垃圾收集器特点**: - Serial GC:简单且高效,适合单CPU环境...

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    5. **Spring Bean的加载过程**:Spring容器解析配置文件或注解,创建并初始化bean实例,完成依赖注入等。 6. **Spring AOP的实现**:通过代理机制实现面向切面编程,可以使用`@Aspect`和`@Around`等注解定义切面逻辑...

    网管教程 从入门到精通软件篇.txt

     注意: 如果不带任何参数,fixboot 命令将向用户登录的系统分区写入新的分区引导扇区。  Fixmbr  修复启动磁盘的 主启动记录。fixmbr 命令仅在使用故障恢复控制台时才可用。  fixmbr [ device_name]  参数 ...

    java开源包1

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包2

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包3

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

Global site tag (gtag.js) - Google Analytics