`

SpringMVC杂记(十六) spring-mvc 与 openid4java

阅读更多
SpringMVC杂记(十六) spring-mvc 与 openid4java
以GoogleOpenID 为例,试验了OAuth单点登录的用法

<dependency>
	<groupId>org.openid4java</groupId>
	<artifactId>openid4java</artifactId>
	<version>0.9.8</version>
</dependency>


import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.openid4java.OpenIDException;
import org.openid4java.consumer.ConsumerManager;
import org.openid4java.consumer.VerificationResult;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.discovery.Identifier;
import org.openid4java.message.AuthRequest;
import org.openid4java.message.AuthSuccess;
import org.openid4java.message.ParameterList;
import org.openid4java.message.ax.AxMessage;
import org.openid4java.message.ax.FetchRequest;
import org.openid4java.message.ax.FetchResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.util.UriComponentsBuilder;

import com.google.common.base.Throwables;

@Controller
@RequestMapping("/openid")
@SuppressWarnings("rawtypes")
public class SecurityOpenIDController {

	public static final String GOOGLE_ENDPOINT = "https://www.google.com/accounts/o8/id";
	private static final Logger LOGGER = LoggerFactory.getLogger(SecurityOpenIDController.class);

	public final ConsumerManager manager = new ConsumerManager();

	@RequestMapping("/login")
	public void login(
			UriComponentsBuilder builder,
			HttpServletRequest request,
			HttpServletResponse response
		) throws Exception
	{
		// configure the return_to URL where your application will receive
        // the authentication responses from the OpenID provider
		String returnUrl = builder.path("/openid/return").build().toUriString();
		
		// --- Forward proxy setup (only if needed) ---
		// ProxyProperties proxyProps = new ProxyProperties();
		// proxyProps.setProxyName("proxy.example.com");
		// proxyProps.setProxyPort(8080);
		// HttpClientFactory.setProxyProperties(proxyProps);

		// perform discovery on the user-supplied identifier
		List discoveries = manager.discover(GOOGLE_ENDPOINT);

		// attempt to associate with the OpenID provider
		// and retrieve one service endpoint for authentication
		DiscoveryInformation discovered = manager.associate(discoveries);
		
		// store the discovery information in the user's session
		request.getSession().setAttribute("openid-disc", discovered);

		// obtain a AuthRequest message to be sent to the OpenID provider
		AuthRequest authReq = manager.authenticate(discovered, returnUrl);

		// attribute Exchange
		FetchRequest fetch = FetchRequest.createFetchRequest();
		fetch.addAttribute("email", "http://axschema.org/contact/email", true);
		fetch.addAttribute("firstName", "http://axschema.org/namePerson/first", true);
		fetch.addAttribute("lastName", "http://axschema.org/namePerson/last", true);
		
		// attach the extension to the authentication request
		authReq.addExtension(fetch);

		if (!discovered.isVersion2()) {
			// Option 1: GET HTTP-redirect to the OpenID Provider endpoint
			// The only method supported in OpenID 1.x
			// redirect-URL usually limited ~2048 bytes
			response.sendRedirect(authReq.getDestinationUrl(true));
		} else {
			// Option 2: HTML FORM Redirection (Allows payloads >2048 bytes)
			response.sendRedirect(authReq.getDestinationUrl(true));
		}
	}

	@RequestMapping("/return")
	public void verifyResponse(HttpServletRequest request) {
		String email = null;
		String lastName = null;
		String firstName = null;
		
		try {
			// extract the parameters from the authentication response
			// (which comes in as a HTTP request from the OpenID provider)
			ParameterList response = new ParameterList(request.getParameterMap());

			// retrieve the previously stored discovery information
			DiscoveryInformation discovered = (DiscoveryInformation) request.getSession().getAttribute("openid-disc");

			// extract the receiving URL from the HTTP request
			StringBuffer receivingURL = request.getRequestURL();
			String queryString = request.getQueryString();
			if (queryString != null && queryString.length() > 0) {
				receivingURL.append("?").append(request.getQueryString());
			}

			// verify the response; ConsumerManager needs to be the same
			// (static) instance used to place the authentication request
			VerificationResult verification = manager.verify(receivingURL.toString(), response, discovered);

			// examine the verification result and extract the verified
			// identifier
			Identifier verified = verification.getVerifiedId();
			if (verified != null) {
				AuthSuccess authSuccess = (AuthSuccess) verification.getAuthResponse();

				if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)) {
					FetchResponse fetchResp = (FetchResponse) authSuccess.getExtension(AxMessage.OPENID_NS_AX);

					List emails = fetchResp.getAttributeValues("email");
					email = (String) emails.get(0);
					
					List lastNames = fetchResp.getAttributeValues("lastName");
					lastName = (String) lastNames.get(0);
					
					List firstNames = fetchResp.getAttributeValues("firstName");
					firstName = (String) firstNames.get(0);
					
					LOGGER.debug("email: {}", email);
					LOGGER.debug("lastName: {}", lastName);
					LOGGER.debug("firstName: {}", firstName);
				}
				// success
				
				// 在这里与安全框架集成 apache-shiro/spring-security
				// 这里要根据相关的信息自己定义Principal
			}
		} catch (OpenIDException e) {
			LOGGER.error(e.getMessage(), e);
			Throwables.propagate(e);
		}
	}
}
分享到:
评论
1 楼 slovewithf 2015-05-07  
怎么一运行就报
Caused by: java.lang.NoClassDefFoundError: org/apache/http/client/ClientProtocolException
at org.openid4java.consumer.ConsumerManager.<init>(ConsumerManager.java:146)

没找到构造函数呢

相关推荐

    sentinel-spring-webmvc-adapter-1.8.0-API文档-中文版.zip

    标签:spring、alibaba、csp、sentinel、adapter、webmvc、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...

    spring-mvc-官方中文文档

    Spring MVC 是 Spring 框架的一个重要组成部分,用于构建基于 Java 的 Web 应用程序。这个官方中文文档详细地介绍了如何使用 Spring MVC 来开发高效、可维护的 MVC(Model-View-Controller)架构的应用。Spring MVC ...

    spring-webmvc-5.2.15.RELEASE-API文档-中文版.zip

    标签:springframework、spring、webmvc、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    spring-webmvc-5.3.10-API文档-中文版.zip

    标签:springframework、spring、webmvc、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    最全最经典spring-mvc教程

    另外,Spring MVC与Spring框架的其他组件无缝集成,如Spring AOP(面向切面编程)用于实现日志、事务管理等功能,Spring JDBC和MyBatis等持久层框架用于数据库操作,以及Spring Data JPA、Hibernate等ORM工具,使得...

    spring-webmvc-5.0.8.RELEASE-API文档-中文版.zip

    标签:springframework、spring、webmvc、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    配置springmvc的spring-webmvc的jar包

    在Java开发中,尤其是SSM(Spring、SpringMVC、MyBatis)框架的使用中,`spring-webmvc`扮演着至关重要的角色。 **一、Spring MVC的核心概念** 1. **DispatcherServlet**:它是Spring MVC的前端控制器,负责接收...

    SpringMVC ---- HelloWorld ---- 代码

    SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- HelloWorld ---- 代码 SpringMVC ---- Hello...

    spring-webmvc jar包

    spring-webmvc-4.1.0.RELEASE.jar用于Spring框架的mvc注解

    spring-mvc.xml

    spring-mvc.xml资源下载,本xml为springmvc最纯净版xml!

    SpringMVC-Mybatis-Shiro-redis-master

    【标题】"SpringMVC-Mybatis-Shiro-redis-master" 涉及的是一个集成框架项目,这个项目集成了四个关键的技术组件:SpringMVC、MyBatis、Shiro和Redis。这些技术在现代Java Web开发中扮演着重要角色。 **SpringMVC**...

    spring-webmvc-4.3.20.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-webmvc-4.3.20.RELEASE.jar 赠送原API文档:spring-webmvc-4.3.20.RELEASE-javadoc.jar 赠送源代码:spring-webmvc-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-webmvc-4.3.20....

    SpringMVC包(spring-frame-3.2.0)

    SpringMVC是Spring框架的一个重要组成部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。Spring框架以其强大的依赖注入(DI)和面向切面编程(AOP)能力而闻名,而SpringMVC则为这些功能提供了一个用于...

    spring-mvc与xfire的集成

    spring-mvc与xfire的集成 对于这样的集成,看看里面的配置文件就行了 一个简单的接口,对应一个简单的实现。 然后在配置文件里指明就可以了。 DispatcherServlet本身会管理xfire的请求 配置文件中配置的key可以理解...

    spring-webmvc-4.3.14.RELEASE.zip

    spring-webmvc-4.3.14.RELEASE SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是...

    spring-webmvc-5.3.26.jar

    spring-webmvc.jar 各个版本,免费下载 spring-webmvc-RELEASE.jar 各个版本,免费下载 如果不能免费下载,关注我,评论区联系我索要!

    spring-webmvc-6.0.9.jar

    spring-webmvc.jar 各个版本,免费下载 spring-webmvc-RELEASE.jar 各个版本,免费下载 如果不能免费下载,关注我,评论区联系我索要!

    spring-webmvc-5.2.6.RELEASE.jar

    spring-webmvc.jar 各个版本,免费下载 spring-webmvc-RELEASE.jar 各个版本,免费下载 如果不能免费下载,关注我,评论区联系我索要!

    spring-webmvc-5.0.10.RELEASE-API文档-中英对照版.zip

    标签:spring、webmvc、springframework、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...

    spring-webmvc-5.3.3.jar

    spring-webmvc.jar 各个版本,免费下载 spring-webmvc-RELEASE.jar 各个版本,免费下载 如果不能免费下载,关注我,评论区联系我索要!

Global site tag (gtag.js) - Google Analytics