`
Tyler_Zhou
  • 浏览: 216997 次
  • 性别: Icon_minigender_1
  • 来自: 湖北->上海
社区版块
存档分类
最新评论

liferay openid配置与代码详解

阅读更多

1.liferay的openid的配置很简单的,先去 openid提供商注册一个自已的openid如果已经有就不用了,现在yahoo,google都提供openid,你也可以在www.myopenid.com上面去注册一个。

2. portal.properties文件open.id.auth.enabled=true,liferay5.0默认就是true,然后用你的openid登陆lliferay。

3.liferay在发送验证之前,以你的openid为ScreenName去查找用户,如果没有这个用户,会向提供商请求first name,last name,mail三个参数。

4.接收验证成功,如果三个参数都能获取,liferay会自动为你注册一个帐户,如果有一个参数为空就跳往新增用户页面。

下面是相关代码的解释:

 

	public static void sendOpenIdRequest(
			ThemeDisplay themeDisplay, HttpServletRequest req,
			HttpServletResponse res, String openId)
		throws Exception {

		if (!OpenIdUtil.isEnabled(themeDisplay.getCompanyId())) {
			return;
		}

		HttpSession ses = req.getSession();

		String returnURL =
			PortalUtil.getPortalURL(req) + themeDisplay.getPathMain() +
				"/portal/open_id_response";
		//创建消费者对象,它将向认证服务器发出认证请求
		ConsumerManager manager = OpenIdUtil.getConsumerManager();
		//下载OpenID提供者列表,返回结果将按照用户指定的优选顺序排列
		List<DiscoveryInformation> discoveries = manager.discover(openId);
		//通过关联获取和OpenID提供者之间的共享密钥
		DiscoveryInformation discovered = manager.associate(discoveries);
		//密钥放入用户session以方便后面使用
		ses.setAttribute(WebKeys.OPEN_ID_DISCO, discovered);
		//将用户重定向到他们的OpenID提供者页面,并告诉OpenID提供者外部站点的地址
		AuthRequest authReq = manager.authenticate(discovered, returnURL);
		
		String screenName = OpenIdUtil.getScreenName(openId);

		try {
			//通过openid取用户
			UserLocalServiceUtil.getUserByScreenName(
				themeDisplay.getCompanyId(), screenName);
		}
		//没有screenName为openid的用户
		catch (NoSuchUserException nsue) {
			//构建一个空的请求参数列表
			FetchRequest fetch = FetchRequest.createFetchRequest();
			//写上请求的参数(姓名和邮箱,以方便注册用)
			fetch.addAttribute(
				"email", "http://schema.openid.net/contact/email", true);
			fetch.addAttribute(
				"firstName", "http://schema.openid.net/namePerson/first", true);
			fetch.addAttribute(
				"lastName", "http://schema.openid.net/namePerson/last", true);

			authReq.addExtension(fetch);
			//构建一个空的请求参数列表(与FetchRequest什么区别暂时还不清楚)
			SRegRequest sregReq = SRegRequest.createFetchRequest();

			sregReq.addAttribute("fullname", true);
			sregReq.addAttribute("email", true);

			authReq.addExtension(sregReq);
		}
		//发往OpenID提供者页面
		res.sendRedirect(authReq.getDestinationUrl(true));
	}

 

	protected User readResponse(
			ThemeDisplay themeDisplay, HttpServletRequest req)
		throws Exception {

		HttpSession ses = req.getSession();

		ConsumerManager manager = OpenIdUtil.getConsumerManager();

		ParameterList params = new ParameterList(req.getParameterMap());
		//取得session中的密钥
		DiscoveryInformation discovered =
			(DiscoveryInformation)ses.getAttribute(WebKeys.OPEN_ID_DISCO);
		
		if (discovered == null) {
			return null;
		}

		StringBuffer receivingURL = req.getRequestURL();
		String queryString = req.getQueryString();

		if ((queryString != null) && (queryString.length() > 0)) {
			receivingURL.append(StringPool.QUESTION);
			receivingURL.append(req.getQueryString());
		}
		//校验
		VerificationResult verification = manager.verify(
			receivingURL.toString(), params, discovered);

		Identifier verified = verification.getVerifiedId();

		if (verified == null) {
			return null;
		}

		AuthSuccess authSuccess = (AuthSuccess)verification.getAuthResponse();

		String firstName = null;
		String lastName = null;
		String emailAddress = null;
		//获取信息
		if (authSuccess.hasExtension(SRegMessage.OPENID_NS_SREG)) {
			MessageExtension ext = authSuccess.getExtension(
				SRegMessage.OPENID_NS_SREG);

			if (ext instanceof SRegResponse) {
				SRegResponse sregResp = (SRegResponse)ext;

				String fullName = GetterUtil.getString(
					sregResp.getAttributeValue("fullname"));

				int pos = fullName.indexOf(StringPool.SPACE);

				if ((pos != -1) && ((pos + 1) < fullName.length())) {
					firstName = fullName.substring(0, pos);
					lastName = fullName.substring(pos + 1);
				}

				emailAddress = sregResp.getAttributeValue("email");
			}
		}

		if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)) {
			MessageExtension ext = authSuccess.getExtension(
				AxMessage.OPENID_NS_AX);

			if (ext instanceof FetchResponse) {
				FetchResponse fetchResp = (FetchResponse)ext;

				if (Validator.isNull(firstName)) {
					firstName = getFirstValue(
						fetchResp.getAttributeValues("firstName"));
				}

				if (Validator.isNull(lastName)) {
					lastName = getFirstValue(
						fetchResp.getAttributeValues("lastName"));
				}

				if (Validator.isNull(emailAddress)) {
					emailAddress = getFirstValue(
						fetchResp.getAttributeValues("email"));
				}
			}
		}

		String screenName = OpenIdUtil.getScreenName(authSuccess.getIdentity());

		User user = null;

		try {
			//通过openid做为ScreenName试着能否查找出这个用户
			user = UserLocalServiceUtil.getUserByScreenName(
				themeDisplay.getCompanyId(), screenName);
		}
		catch (NoSuchUserException nsue) {
			//如果openid提供没有firstName之类的用户信息,报错
			if (Validator.isNull(firstName) || Validator.isNull(lastName) ||
				Validator.isNull(emailAddress)) {

				SessionErrors.add(req, "missingOpenIdUserInformation");

				_log.error(
					"The OpenID provider did not send the required " +
						"attributes to create an account");

				return null;
			}
			//能取到信息就生成一个用户
			user = addUser(
				themeDisplay.getCompanyId(), firstName, lastName, emailAddress,
				screenName, themeDisplay.getLocale());
		}

		ses.setAttribute(WebKeys.OPEN_ID_LOGIN, new Long(user.getUserId()));

		return user;
	}

在网上很难找到操作openid的相关api中文帮助文档,下面是我在网上找的一段希望能对大家有所帮助

依赖方发送 SRegRequest
SRegRequest sregReq = SRegRequest.createFetchRequest();

sregReq.addAttribute("fullname", true);
sregReq.addAttribute("nickname", true);
sregReq.addAttribute("email", true);

AuthRequest req = _consumerManager.authenticate(discovered, return_to);
req.addExtension(sregReq);OpenID 提供方接受 SRegRequest
if (authReq.hasExtension(SRegMessage.OPENID_NS_SREG))
{
    MessageExtension ext = authReq.getExtension(SRegMessage.OPENID_NS_SREG)

    if (ext instanceof SRegRequest)
    {
        SRegRequest sregReq = (SRegRequest) ext;
        List required = sregReq.getAttributes(true);
        List optional = sregReq.getAttributes(false);
        // prompt the user
    }
}OpenID 提供方发送 SRegResponse
    // data released by the user
    Map userData = new HashMap();
    //userData.put("email", "user@example.com");

    SRegResponse sregResp = SRegResponse.createSRegResponse(sregReq, userData);

    // (alternatively) manually add attribute values
    sregResp.addAttribute("email", "user@example.com");

    authSuccess.addExtension(sregResp);依赖方接受 SRegResponse
if (authSuccess.hasExtension(SRegMessage.OPENID_NS_SREG))
{
    MessageExtension ext = authSuccess.getExtension(SRegMessage.OPENID_NS_SREG);

    if (ext instanceof SRegResponse)
    {
        SRegResponse sregResp = (SRegResponse) ext;
        
        String fullName = sregResp.getAttributeValue("fullname");
        String nickName = sregResp.getAttributeValue("nickname");
        String email = sregResp.getAttributeValues("email");
    }
}

 

分享到:
评论
2 楼 Tyler_Zhou 2008-11-24  
lishaoyun 写道

补一下第四讲的视频教程嘛.我一直在等着了..

第四讲丢掉的都是一些具体的portlet的操作,其实大家摸索一下,就能知道是怎么操作的了,很简单的。
1 楼 lishaoyun 2008-11-24  
补一下第四讲的视频教程嘛.我一直在等着了..

相关推荐

    Liferay5.1.2配置Oracle10G数据库操作说明书

    【Liferay 5.1.2 配置 Oracle 10G 数据库操作详解】 Liferay 是一款开源的企业级门户平台,它默认使用 HSQLDB 作为内置数据库。然而,在某些场景下,用户可能需要将数据库迁移至更强大的 Oracle 10G 数据库。这个...

    liferay相关的代码

    例如,一个portlet的代码可能包含了渲染逻辑、服务端处理请求的方法,以及与视图(JSP)的交互。而一个主题的代码则会展示如何改变Liferay的外观和布局,包括CSS、图片和HTML模板的定制。 学习Liferay的源码和使用...

    Liferay Portal内容和布局详解

    ### Liferay Portal的内容和布局详解 #### 一、布局(Layout) **布局**是Liferay Portal中用于管理Portlet的关键概念之一。布局不仅决定着Portlet的呈现方式,还影响着用户的交互体验。在Liferay中,布局是通过一...

    liferay + cas + ldap 集成配置

    标题 "Liferay + CAS + LDAP 集成配置" 涉及到的是在企业级内容管理系统 Liferay 中集成 Central Authentication Service (CAS) 和 Lightweight Directory Access Protocol (LDAP) 的过程。这种集成允许用户通过CAS...

    Liferay portlet 工程示例代码

    Liferay Portlet工程示例代码提供了开发者们一个深入理解并实践Liferay Portal平台上的portlet开发的宝贵资源。Liferay Portal是一款开源的企业级门户系统,它允许用户创建、管理和集成各种Web应用程序,而portlet...

    liferay开发配置资料(全)

    另外,Liferay的数据存储通常依赖于数据库,因此了解如何设计和优化数据库查询,以及如何与Liferay的数据模型配合,对于性能优化至关重要。Liferay的缓存机制,如Hazelcast和OSCache,也是提高系统性能的关键。 ...

    liferay in actin源代码

    5. **安全性与权限**:Liferay的安全模型基于角色和权限,源代码可能会展示如何设置和管理用户权限,以及如何保护敏感数据。 6. **国际化和本地化**:Liferay支持多语言,源代码中可能包含资源文件,用于实现界面的...

    LIFERAY4.2.0版配置

    在本文中,我们将深入探讨如何配置Liferay 4.2.0版本,这是一个知名的开源企业级门户平台。根据描述,虽然官方文档可能是针对4.3.5版本的,但据称4.2.0版本与之仅有微小差异。我们将重点关注如何在Eclipse集成环境中...

    liferay-portal详解

    liferay-portal详解 Liferay Portal 是一个基于 Java 的开源门户平台,提供了一个灵活的框架来构建企业门户和 web 应用程序。本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal ...

    liferay表结构详解

    本文将以“liferay表结构详解”为主题,聚焦于Liferay数据库中的Layout表,旨在详尽解读此表的功能与结构,以及它在Liferay门户系统中的关键作用。 ### Layout表:存储页面布局信息 **功能概述**:Layout表在...

    Liferay5.2.3和CAS配置成SSO

    本案例中,我们将探讨如何将Liferay 5.2.3与CAS(Central Authentication Service)配置为SSO系统。 Liferay是一款开源的企业级门户平台,它提供了一个灵活的框架来构建和管理Web应用程序。而CAS则是一个开源的身份...

    liferay_portlet对象详解

    【Liferay Portlet 对象详解】 在 Liferay 平台中,Portlet 是核心组件,它负责呈现内容和提供互动功能。Portlet 技术的理解和应用是开发 Liferay 应用程序的关键。本文将深入解析 Portlet 的关键概念,包括 ...

    liferay开发文档.pdf

    liferay开发文档.pdf Liferay 是一个基于Java的开源企业门户平台,...这些知识点涵盖了Liferay 的安装、配置、Portlet开发、术语与缩写解释、版本历史等方面,旨在帮助读者更好地理解Liferay 的工作原理和开发技术。

    liferay+cas

    在 Liferay 与 CAS 集成的过程中,关键在于正确配置 CAS 服务器和 Liferay 的相关配置文件,确保两者之间的通信顺畅。通过这种方式,用户只需要一次登录即可访问所有集成的应用,提升了用户体验并强化了安全性。在...

    liferay实现增删改查的源代码

    liferay是一个强大的工具,开发者只用写一个持久层的配置文件,改工具就反向生成持久层和业务层的代码.简单说来,工具会自动生成hibernate层和spring层的相关代码,开发者只用关心控制层即可.

    Liferay 配置oracle DB的脚本

    新建Liferay的DB,然后将该文件导入该DB后,即可创建Liferay所需要的Table,并insert提供的初始值。

Global site tag (gtag.js) - Google Analytics