`

Spring Security oAuth学习之Hello World

 
阅读更多
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

OAUTH有1.0和2.0两个版本,2.0版本在1.0版本的基础上做了很多调整和改进,但目前尚不完善。

Spring Secrutiy的大名相信大家都应该有所了解,新的Spring Security版本对oAuth1.0有了完美的支持,支持oAuth2.0的版本目前正在开发过程中。

Spring Security官网上给出的sparklr和tonr的样例对于象笔者这样的初学者可能还是有点难以理解,所以我把学习过程中自己设计的一个Hello World的例子整理了一下与大家分享。

Server端的web.xml:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/security</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/oauth/*</url-pattern>
</servlet-mapping>



下面是spring mvc配置(/WEB-INF/spring-servlet.xml):

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean name="/security" class="com.coolfancy.oauth.server.SecurityController" />
<bean name="/confirm_access" class="com.coolfancy.oauth.server.ConfirmationController">
<property name="tokenServices" ref="tokenServices" />
<property name="consumerDetailsService" ref="consumerDetails" />
</bean>



下面是spring security的配置(/WEB-INF/spring-security.xml):


<http auto-config='true' access-denied-page="/public/index">
<intercept-url pattern="/security" access="ROLE_USER" />
<intercept-url pattern="/oauth/**" access="ROLE_USER" />
<intercept-url pattern="/request_token_authorized.jsp" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</http>
<authentication-provider>
<user-service>
<user name="a" password="a" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
<oauth:provider
consumer-details-service-ref="consumerDetails"
token-services-ref="tokenServices"
request-token-url="/oauth/request_token"
authenticate-token-url="/oauth/authorize"
authentication-failed-url="/oauth/confirm_access"
access-granted-url="/request_token_authorized.jsp"
access-token-url="/oauth/access_token"
require10a="false" />
<oauth:consumer-details-service id="consumerDetails">
<oauth:consumer name="Fancy"
key="fancy-consumer-key"
secret="SHHHHH!!!!!!!!!!"
resourceName="Your Secrect"
resourceDescription="Your Secrect Response!" />
</oauth:consumer-details-service>
<oauth:token-services id="tokenServices" />


ConfirmationController:

package com.coolfancy.oauth.server;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.oauth.provider.ConsumerDetails;
import org.springframework.security.oauth.provider.ConsumerDetailsService;
import org.springframework.security.oauth.provider.token.OAuthProviderToken;
import org.springframework.security.oauth.provider.token.OAuthProviderTokenServices;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class ConfirmationController extends AbstractController {
private OAuthProviderTokenServices tokenServices;
private ConsumerDetailsService consumerDetailsService;
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
String token = request.getParameter("oauth_token");
if (token == null) {
throw new IllegalArgumentException("A request token to authorize must be provided.");
}
OAuthProviderToken providerToken = getTokenServices().getToken(token);
ConsumerDetails consumer = getConsumerDetailsService().loadConsumerByConsumerKey(providerToken.getConsumerKey());
String callback = request.getParameter("oauth_callback");
TreeMap<String, Object> model = new TreeMap<String, Object>();
model.put("oauth_token", token);
if (callback != null) {
model.put("oauth_callback", callback);
}
model.put("consumer", consumer);
return new ModelAndView("access_confirmation", model);
}
public OAuthProviderTokenServices getTokenServices() {
return tokenServices;
}
public void setTokenServices(OAuthProviderTokenServices tokenServices) {
this.tokenServices = tokenServices;
}
public ConsumerDetailsService getConsumerDetailsService() {
return consumerDetailsService;
}
public void setConsumerDetailsService(ConsumerDetailsService consumerDetailsService) {
this.consumerDetailsService = consumerDetailsService;
}
}


SecurityController:

package com.coolfancy.oauth.server;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class SecurityController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("html/plain");
final PrintWriter out = response.getWriter();
out.println("Hello World!");
out.close();
return null;
}
}



下面是客户端,首先是web.xml:

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/security/*</url-pattern>
</servlet-mapping>


Spring MVC配置(/WEB-INF/spring-servlet.xml):

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean name="/test" class="com.coolfancy.oauth.client.SecurityController">
<property name="security_url" value="http://localhost:8080/server/security" />
<property name="support" ref="oauthConsumerSupport" />
</bean>



Spring Security配置(/WEB-INF/applicationContext.xml):

<http auto-config="true">
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</http>
<authentication-provider>
<user-service>
<user name="a" password="a" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
<oauth:consumer resource-details-service-ref="resourceDetails">
<oauth:url pattern="/security/**" resources="security_content" />
</oauth:consumer>
<oauth:resource-details-service id="resourceDetails">
<oauth:resource id="security_content" key="fancy-consumer-key" secret="SHHHHH!!!!!!!!!!" request-token-url="http://localhost:8080/server/oauth/request_token"
user-authorization-url="http://localhost:8080/server/oauth/confirm_access" access-token-url="http://localhost:8080/server/oauth/access_token" />
</oauth:resource-details-service>


最后是SecurityController:

package com.coolfancy.oauth.client;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.oauth.consumer.CoreOAuthConsumerSupport;
import org.springframework.security.oauth.consumer.OAuthConsumerProcessingFilter;
import org.springframework.security.oauth.consumer.token.OAuthConsumerToken;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class SecurityController extends AbstractController {
private String security_url;
private CoreOAuthConsumerSupport support;
@SuppressWarnings("unchecked")
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
OAuthConsumerToken token = null;
final List<OAuthConsumerToken> tokens = (List<OAuthConsumerToken>) request.getAttribute(OAuthConsumerProcessingFilter.ACCESS_TOKENS_DEFAULT_ATTRIBUTE);
if (tokens != null) {
for (OAuthConsumerToken consumerToken : tokens) {
if (consumerToken.getResourceId().equals("security_content")) {
token = consumerToken;
break;
}
}
}
if (token == null) {
throw new IllegalArgumentException("Access token not found.");
}
final InputStream stream = support.readProtectedResource(new URL(security_url), token, "GET");
final BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
final String content = reader.readLine();
reader.close();
return new ModelAndView("security", "content", content);
}
public CoreOAuthConsumerSupport getSupport() {
return support;
}
public void setSupport(CoreOAuthConsumerSupport support) {
this.support = support;
}
public String getSecurity_url() {
return security_url;
}
public void setSecurity_url(String security_url) {
this.security_url = security_url;
}
}


运行效果如下。

访问客户程序首页,点击连接后客户程序请求访问第三方资源:


第三方进行用户认证:




认证后完成后,第三方要求用户确认被授权访问的资源:




授权访问完成,客户程序显示被授权访问的资源内容:




完整的样例工程下载:spring_security_oauth_helloworld.zip
  • 大小: 50 KB
  • 大小: 67.8 KB
  • 大小: 91 KB
  • 大小: 68.6 KB
分享到:
评论
2 楼 小清新雪仔_ 2017-03-12  
报错The import org.springframework.security.oauth cannot be
resolved
为什么??缺少了什么jar包吗??
1 楼 xiaoxiao_qiang 2015-07-04  
感谢,正在学习oAuth,有机会一起交流

相关推荐

    spring security (-) helloWorld

    《Spring Security HelloWorld详解》 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java EE和Spring应用程序中。本篇文章将基于“spring security - helloWorld”项目,探讨...

    Spring-Security-3-HelloWorld 实例简单代码

    在这个"Spring-Security-3-HelloWorld"实例中,我们将探讨如何在Spring MVC应用中集成Spring Security的基本配置和用法。 首先,Spring Security的核心功能包括用户认证、权限授权、CSRF保护、会话管理等。在Spring...

    Spring Security 教程(Spring Security Tutorial)1

    - 学习 Spring Security 的第一步通常是创建一个简单的 "Hello World" 应用,这通常涉及添加必要的依赖和配置,以便启动基础的安全功能。 3. **单元测试**: - 在安全相关的开发中,单元测试是必不可少的,因为它...

    s2oauth:Spring Security Oauth Grails 3插件

    其中包含: s2oauth:基本插件s2oauth-facebook:Facebook实现s2oauth-dummy:虚拟实现,在不涉及实际提供者的情况下对测试很有用helloworld:使用插件的实际应用要构建所有项目并进行应用大战: ./gradlew war要...

    Spring-Security安全权限管理手册

    在示例的 "一个简单的 HelloWorld" 中,Spring Security 的配置可能涉及以下几个关键组件: 1. **Filter Security Interceptor**: 这是Spring Security的核心组件,它拦截HTTP请求,根据配置的访问控制规则决定是否...

    spring security详解

    - **Hello World 示例**:介绍如何通过简单的步骤配置Spring Security,并实现一个基本的认证功能。 - **使用数据库管理用户权限**:学习如何使用数据库存储用户信息和权限,并实现动态权限管理。 - **自定义数据库...

    Spring2.0(一)第一个Spring程序、IoC的应用

    5. **运行程序**:当运行`MainApp`时,Spring会自动创建`HelloWorld`实例并注入配置的属性,然后调用`printMessage`方法输出消息。 关于IoC的应用,它是Spring的核心特性之一,通过反转对象的创建和管理方式,将...

    spring-boot示例项目

    该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...

    【42】使用dubbo、spring-boot等技术实现互联网后台服务项目架构视频教程 .txt

    ### 使用Dubbo、Spring Boot等技术实现互联网后台服务项目架构 #### 一、引言 在当前快速发展的互联网行业中,微服务架构已经成为构建复杂系统的一种主流方式。微服务架构能够帮助开发团队更好地组织代码,提高...

    spring-boot学习文档

    3. **创建第一个Spring Boot应用**:通过一个简单的“Hello, World!”示例,展示如何创建一个新的Spring Boot项目,包括使用Spring Initializr和构建工具如Maven或Gradle。 4. **内置服务器**:讲解Spring Boot如何...

    spring boot教程源码

    - 第一个 Spring Boot 应用:编写 Hello World 程序,理解主配置类和@SpringBootApplication 注解的作用。 2. **Chapter 2 - Web 开发** - Spring MVC:讲解 Spring MVC 框架的基础,包括 Controller、Model、...

    深入浅出Spring Boot 2.x(杨开振著)项目代码

    第一章通常会介绍如何创建一个基本的Spring Boot应用,包括使用Spring Initializr初始化项目、构建Gradle或Maven工程、以及编写Hello World程序。源码中可能包含了一个简单的RESTful API示例,演示了如何使用Spring...

    spring-boot-demo:spring boot demo是一个Spring Boot,Spring Cloud的项目示例,根据市场主流的布局技术,共集成了30+个demo,未来将持续更新。该项目包含helloworld(快速入门), web(ssh项目快速构建),aop(切面编程),data-redis(redis缓存),quartz(任务实现),shiro(权限管理),oauth2(必要认证模式),shign(接口参数防篡改改重)放),编码器(用户密码设计),执行器(服务监控),cloud-c

    本项目示例基于spring boot最新版本(2.4.0)实现,Spring Boot,Spring Cloud学习示例,将持续更新…… 在基于Spring Boot,Spring Cloud的分布式微服务开发过程中,根据实际项目环境,需要选择,集成符合项目需求...

    cXF实现webservice 服务端和客户端

    1. 安全性:CXF支持各种安全模型,如基本认证、WS-Security、OAuth等,可以确保Web服务的安全通信。 2. 缓存与性能:CXF提供缓存机制,可以提高服务调用的效率。 3. 支持RESTful风格:CXF不仅支持传统的SOAP Web服务...

    webservice2

    1. 安全性:CXF支持WS-Security、OAuth等安全机制,确保服务的安全性。 2. 模板消息:CXF允许使用Velocity或Freemarker模板来动态生成消息内容。 3. 事务处理:CXF可以集成Spring事务管理,提供事务支持。 总结,...

    Java项目经验汇总.rar

    - **OAuth2认证**:集成Spring Security实现OAuth2授权服务器,理解身份验证和授权流程。 - **自动化测试**:运用JUnit、Mockito进行单元测试,使用Selenium进行Web端的集成测试。 8. **持续集成与部署** - **...

    CXF框架快速起步1

    1. **安全配置**:CXF支持WS-Security、OAuth等安全机制,保护服务免受非法访问。 2. **数据验证**:可以结合JAXB和JSR-303/JSR-349 Bean Validation进行数据验证。 3. **异常处理**:CXF提供了一套标准的异常处理...

    BackEnd-SpringBoot-Books:Spring Boot 2-Curso Completo 2020

    1. 入门:了解Spring Boot的基本概念和优势,安装并创建第一个"Hello, World!"应用。 2. 核心技术:深入学习自动配置、启动器、Actuator等关键特性。 3. 数据访问:掌握JPA和MyBatis等持久层技术,进行CRUD操作。 4....

    spring-tutorials:通过https工作

    在IT行业中,Spring框架是Java开发者的首选工具之一,尤其在构建RESTful Web服务方面,它的强大功能和灵活性使得开发者可以高效地创建高质量的应用。在这个"spring-tutorials:通过HTTPS工作"的主题中,我们将深入...

Global site tag (gtag.js) - Google Analytics