使用Crowd实现单点登录2——配置应用

本文与crowd单点登录1 略有重复之处,读者自己甄别。

本文依然是从服务器的安装开始讲起,至于破解方式,参见拙文:crowd单点登录1

第一章 安装crowd服务器

第一步 填写title

Deployment Title:指的是部署名称,是服务标识名称,可以自己定义。

Base URL 是服务器访问域名称,最好采用域名形式的,为以后配置应用做准备。

第二步:       填写邮件地址和邮件服务器,为了防止密码丢失或者其他的一些功能,邮件必须填写,可以填写假的邮箱。

第三步:       内部目录结构名称,可以默认

第四步:       默认管理员信息,包括用来登录该服务器的用户名密码,请牢记

第五步:     选择是否集成自带几个应用,选择默认即可

第六步 完成服务器的配置

第二章        登录和使用crowd服务器

1、 登录

访问http://zhangxl.software.com:8095/crowd/console/login.action进入登陆页面:

输入第一章、第四步创建的用户名密码,点击login,进入系统首页:

可以看到,页面非常简单,下面逐一介绍各个标签的功能。

2、 服务器主界面

Applications



可以看到该页面有四个已有的应用:

Crowd 可以但Description 这个正是当前登录的服务器控制台,也就是说我们登录的这个crowd服务器同时也是个客户端,只是具备配置各应用的功能而已。

下面三个应用也都是服务器自带的应用而已,尤其是demo,供开发者参考,而且提供demo的源码,以下讲解时也会使用demo作为案例来讲解。

Users

用户管理功能,提供统一用户管理功能,这是集成多个应用的单点登录必不可少的一个功能,也是非常重要的,crowd提供用户的添加、修改、删除、批量导入,并且可以统一授权、统一认证,通过目录、组、角色来分类和授权。

但如果我们仅仅用来测试,仅需要建立几个临时的用户就可以了,Users部分其他的功能可以暂时不考虑。同样,之后三个|Groups|Roles|Directories都是为Users服务的,暂时不去理了。以下说说

Administration

这里是管理操作的较复杂的部分,是服务器本身的一些属性,也是用来配置客户端认证的参数。

General 一般操作,这里很重要一个属性是SSODomain,用来配置当前SSO系统的域名,比如本系统这个参数值就为:software.com。请注意,如果当前浏览器里面的url不是software.com这个域名,则该参数无法这么配置。也就是说,这么一配置就就决定了该系统的服务器和客户端的顶级和二级域名,如果当前登录的不是这个域名,岂不就是自相矛盾了?如果要更改域名,比如更改成test.com,那么要先使用software.com登陆进去,把这个值清空了,然后换成test.com登录进来,把test.com填进去。

Licensing 授权信息这个可以从厂商哪儿获取

Session Config 配置session的超时时间

Current Sessions 查看当前登录的应用和用户

其他的信息自己感兴趣可以看看,下面我们去体验一下单点登录:

我们知道,服务器本身已经集成了几个应用,包括之前提过的demo应用,现在我们已经登录了crowd,demo应用是否可以直接登录呢?那么我们不要关闭浏览器,再打开一个标签:

输入url:http://zhangxl.software.com:8095/demo,可以看到如下界面:

从图中可以看到,demo应用已经是登录状态了。也就是说我们已经实现了单点登录。那么如果我们去集成一个新的应用该如何来做呢?

第三章        项目应用

第一步:            添加jar包与配置文件

随便在myeclipse 建立一个小项目,ssoDemo:一个jsp,两个servlet,实现登录和退出功能即可:

如图所示:

很简单的一个登录框,输入相同的用户名密码,点击登录:

进入到登录状态!那么接下来我们把crowd的jar包和配置文件集成进来,打开crowd服务器的目录结构:

红圈client里面已经为我们提供了需要的jar包和配置文件信息,只需将以下四个jar包导入到lib中即可:

将crowd.properties和crowd-ehcache.xml放在src根目录下:

注意:此处配置文件crowd-ehcache.xml不需改动,crowd.properties必须修改,内容根据之后的配置决定。

第二步:       配置服务器

然后配置crowd服务器,进入服务器Applications选项:

Add Applicatiuon:

ApplicationType 是应用类型,这里我们现在一般应用


这里Description不重要,但NamePassword却需要我们记下来,这个需要在crowd.properties配置文件中用到。点击next>

url中输入应用的url,比如本例ssoDemourl:http://zhangxl.software.com:8080/ssoDemo/,

点击后面的按钮,可以自动解析出Remote IP Address,如果不能解析出来,可以手动填写。注意:这个ip是“应用服务器”所在的Ip。点击next>


选择一个目录,这个目录可以是我们配置服务器时创建的那个,也可以自己重新建立,next>

配置用户权限,对于测试用户来说,可以选择全部,也可以选择图中所示用户组。Next>

确认信息,点击Add Application

到此为止配置完毕,但有几个问题需要注意:

1, 看一看Users里面有没有你想要测试登录的用户:

2, 检查Remote Address里是不是应用所在主机IP

3, Authentication Test中,测试你的用户是否可以成功:

至此,我们的在Crowd服务器配置应用的步骤完全结束!

第三步:       更改配置文件


前四项是比较重要的。

application.name是刚刚配置应用时的应用名称  因配置不同而不同

application.password   是密码    因配置不同而不同

application.login.url这个应用所在的url   因应用不同而变化

crowd.server.url   这个是认证服务器所在的地址,一般不变

其他的配置采用默认即可。

第四步:       添加程序入口,实现登录和退出

接下来我们就需要对我们的应用ssoDemo进行改造:

1, 增加一个servlet,作为单点登录的入口。

2, 在该servlet中,对当前是否存在可识别的、已登录的cookie信息进行获取和校验。

3, 如果校验通过,则转入应用本身自己的登录,这个登录一般是仅需要用户即可登录。与应用本身的(需要用户名密码)不是同一个入口。

4, 登录完成,跳转到目标窗口,完成单点登录。

第一步:增加的servlet

package com.sso;

import java.io.IOException;
import java.rmi.RemoteException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.atlassian.crowd.integration.exception.ApplicationAccessDeniedException;
import com.atlassian.crowd.integration.exception.InvalidAuthorizationTokenException;
import com.atlassian.crowd.integration.http.HttpAuthenticator;
/**
 * 
 * @author zhangxl
 *
 */
public class SSOLoginServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 初始化方法
	 */
	@Override
	public void init() throws ServletException {

		super.init();
		ServletContext servletContext = this.getServletContext();

		WebApplicationContext ctx = WebApplicationContextUtils
				.getWebApplicationContext(servletContext);
		//认证对象,从spring配置文件中获取
		httpAuthenticator = (HttpAuthenticator) ctx.getBean("httpAuthenticator");
		
	}
	
	private HttpAuthenticator httpAuthenticator;
	private Boolean authenticated = null;
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		boolean hasLoggedUser = this.validateLoggedUser(request, response);
		
		
		HttpSession session = request.getSession();
		String userName = null;
		if(hasLoggedUser){
			try {
				/**
				 * 获取当前已登录的cookie用户名
				 */
				 userName = httpAuthenticator.getPrincipal(request).getName();
			} catch (Exception e) {
				e.printStackTrace();
			}
			session.setAttribute("user", userName);
		}else{
			
		}
		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
	
	private boolean validateLoggedUser(HttpServletRequest request,HttpServletResponse response){
		try {
			/**
			 * 验证是否存在合法的登录信息,源码不可见
			 */
			this.authenticated = this.httpAuthenticator.isAuthenticated(request, response);
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (InvalidAuthorizationTokenException e) {
			e.printStackTrace();
		} catch (ApplicationAccessDeniedException e) {
			
			e.printStackTrace();
		}
		
		return this.authenticated;
	}
}

第二步:web.xml进行spring注册

  
  <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext-CrowdClient.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 

说明:applicationContext-CrowdClient.xmljar包里的,这样引入即可,在servlet中获取该bean,如果系统采用其他的框架,应区别对待,获取bean方式可以不同。

第三步:把demojar包全部引入到ssoDemo中,这个是为了图省事,不是每个都需要的,暂时不去辨别了。


第四步:验证

已登录的crowd服务器界面:


然后访问http://zhangxl.software.com:8080/ssoDemo/servlet/SSOLoginServlet单点登录入口

可以看到无需输入用户名、密码,即是登录状态。

注销:对于退出功能,应该是:单点登录的所有应用中,其中一个退出了,所有的session都被注销掉。

在子应用中的注销功能之前,加上一行代码:

httpAuthenticator.logoff(request, response);

这样crowd保存在本地的cookie信息被清除掉,crowd的登录也被注销了。

但是,如果先注销crowd再去刷新一下ssoDemo(子应用),这样是否能注销掉呢?

答案是否定的,因为我们尽管清除了cookie信息,但子应用已经登录了,如果不动态检测和执行退出,是不能随着cookie注销的。

就比如,一个人进门的时需要检验门票,门票通过才能进入,但当人已经进来了,门票即使失效了,人依然在里面。补救的做法就是,一旦这个人有任何活动,都要检测门票是否有效,如果门票失效了,把这人请出去。

回到程序里来,我们需要加一个过滤器:

package com.sso;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;

import com.atlassian.crowd.integration.http.HttpAuthenticator;

public class SSOCookieFilter  implements Filter {
	private HttpAuthenticator httpAuthenticator;

	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletResponse res = (HttpServletResponse)response;
		try {
			//认证通过,继续,不通过注销
			if(httpAuthenticator.isAuthenticated((HttpServletRequest)request, res)){
				chain.doFilter(request, response);
			}else{
				request.getRequestDispatcher("/servlet/logoutServlet").forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
			request.getRequestDispatcher("/servlet/logoutServlet").forward(request, response);
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		ServletContext servletContext = filterConfig.getServletContext();
		WebApplicationContext ctx = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		//认证对象,从spring配置文件中获取
		httpAuthenticator = (HttpAuthenticator) ctx.getBean("httpAuthenticator");
	}

}


关于crowd服务器的下载地址: crowd_server

破解包的下载地址:iNViSiBLE

本文的word版本:word

本文提到的demo:ssoDemo

最后衷心希望各位读者给予批评指正,不吝赐教,共同学习,共同进步。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值