`

spring security for oauth 2 Developers Guide

阅读更多

spring security for oauth 2 Developers Guide

这段时间在看spring security for oauth 2资料真少。只好看官方的Developers Guide 和他们提供的demo。

在这里做一下Developers Guide的总结

oauth2 共分三个部分

1.是oauth的授权与认证中心(文档叫提供端)。

2.是oauth的资源中心

3.是oauth的客户端

 

1.是oauth的授权与认证中心(文档叫提供端)

授权与认证端有两个重要的功能和一些配置功能:

1.1客户端访问被保护的资源是需要得到一个授权,“授权与认证端”提供一个这样的授权功能,也就是第一张通行证授权码。

默认的路径是\oauth\authorize,这个路径对应的代码是AuthorizationEndpoint的authorize(...)方法。

主要作用是,用户通过客户端访问受保护的资源时,客户端会先问问“授权与认证端”当前用户有这个权限访问受保护资源吗,“授权与认证端”就会转到一个输入用户名密码的页面让当前用户输入用户名密码,“授权与认证端”验证用户名和密码,验证无误后就要告诉客户端这个人有权限访问受保护的资源,并给客户端一个第一道门的通行证,客户端可以拿这个第一道门的通行证换第二道们的通行证,(oauth2的授权码模式(authorization code)需要这个流程)

 

1.2是提供第二道门的通行证 token。

默认路径是\oauth\token,对应的代码是TokenEndpoint的ResponseEntity(...)函数。有了第二道门的通行证后客户端就可以拿着它去访问受保护的资源了。当然资源服务器还得确认你这个通行证真假。

 

1.3除了以上两个重要的功能外,“授权与认证端”还得做一些配置。

1.3.1 对于客户端的配置ClientDetailsServiceConfigurer

例如配置授权类型是什么样(有四种授权类型授权码模式(authorization code)简化模式(implicit)密码模式(resource owner password credentials)客户端模式(client credentials))。配置好授权类型后,有客户端需要“授权与认证端”授权时就按照配置好的授权流程走。当然了如果某个客户端说我不要你配置的授权类型,我需一个我自己独有的授权类型,这也能配置。

怎么配置呢?实例代码如下:这是官方的demo。

 

@Configuration
	@EnableAuthorizationServer
	protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

		@Autowired
		private TokenStore tokenStore;

		@Autowired
		private UserApprovalHandler userApprovalHandler;

		@Autowired
		@Qualifier("authenticationManagerBean")
		private AuthenticationManager authenticationManager;

		@Value("${tonr.redirect:http://localhost:80/tonr2/sparklr/redirect}")
		private String tonrRedirectUri;

		@Override
		public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

			// @formatter:off
			clients.inMemory().withClient("tonr")
			 			.resourceIds(SPARKLR_RESOURCE_ID)
			 			.authorizedGrantTypes("authorization_code", "implicit")
			 			.authorities("ROLE_CLIENT")
			 			.scopes("read", "write")
			 			.secret("secret")
			 		.and()
			 		.withClient("tonr-with-redirect")
			 			.resourceIds(SPARKLR_RESOURCE_ID)
			 			.authorizedGrantTypes("authorization_code", "implicit")
			 			.authorities("ROLE_CLIENT")
			 			.scopes("read", "write")
			 			.secret("secret")
			 			.redirectUris(tonrRedirectUri)
			 		.and()
		 		    .withClient("my-client-with-registered-redirect")
	 			        .resourceIds(SPARKLR_RESOURCE_ID)
	 			        .authorizedGrantTypes("authorization_code", "client_credentials")
	 			        .authorities("ROLE_CLIENT")
	 			        .scopes("read", "trust")
	 			        .redirectUris("http://anywhere?key=value")
		 		    .and()
	 		        .withClient("my-trusted-client")
 			            .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
 			            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
 			            .scopes("read", "write", "trust")
 			            .accessTokenValiditySeconds(60)
		 		    .and()
	 		        .withClient("my-trusted-client-with-secret")
 			            .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
 			            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
 			            .scopes("read", "write", "trust")
 			            .secret("somesecret")
	 		        .and()
 		            .withClient("my-less-trusted-client")
			            .authorizedGrantTypes("authorization_code", "implicit")
			            .authorities("ROLE_CLIENT")
			            .scopes("read", "write", "trust")
     		        .and()
		            .withClient("my-less-trusted-autoapprove-client")
		                .authorizedGrantTypes("implicit")
		                .authorities("ROLE_CLIENT")
		                .scopes("read", "write", "trust")
		                .autoApprove(true);
			// @formatter:on
		}

 

1.3.2 AuthorizationServerSecurityConfigurer 配置

这个干什么的没搞懂,先放着。

1.3.3AuthorizationServerEndpointsConfigurer 配置

1.3.3.1配置第二张通行证token的存储方式,用户填写用户名密码以后的处理,以及用户信息的存储方式authenticationManager。重要的是这还能设置AuthorizationServerTokenServices, 下面的代码里没有设置这个参数,既然没有那就用默认的参数呗,默认的是DefaultTokenServices

 

@Override
		public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
			endpoints.tokenStore(tokenStore).userApprovalHandler(userApprovalHandler)
					.authenticationManager(authenticationManager);
		}
@Bean
		public TokenStore tokenStore() {
			return new InMemoryTokenStore();
		}

 

 我们来说说DefaultTokenService,这里面做了什么事呢,当有一个请求说给我第二张通行证token的时候,这个token就是从createAccessToken(...)方法中产生的。这个方法先查查自己的数据库或内存(默认是使用内存的存储方式,上面代码里也是设置的内存存储return new InMemoryTokenStore();也可以设置JdbcTokenStore存储,也就是数据库存储)中有没有这个请求的token,有没有过期,如果有并且没有过期就给返回给他,如果没有就自己创建一个返回给他。
DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
 上面这句话是用来创建token的。
1.3.3.2  可以配置支持 Grant 类型。默认情况下支持所有的 grant 类型。代码如下:
	private TokenGranter tokenGranter() {
		if (tokenGranter == null) {
			ClientDetailsService clientDetails = clientDetailsService();
			AuthorizationServerTokenServices tokenServices = tokenServices();
			AuthorizationCodeServices authorizationCodeServices = authorizationCodeServices();
			OAuth2RequestFactory requestFactory = requestFactory();

			List<TokenGranter> tokenGranters = new ArrayList<TokenGranter>();
			tokenGranters.add(new AuthorizationCodeTokenGranter(tokenServices, authorizationCodeServices,
					clientDetails, requestFactory));
			tokenGranters.add(new RefreshTokenGranter(tokenServices, clientDetails, requestFactory));
			ImplicitTokenGranter implicit = new ImplicitTokenGranter(tokenServices, clientDetails, requestFactory);
			tokenGranters.add(implicit);
			tokenGranters.add(new ClientCredentialsTokenGranter(tokenServices, clientDetails, requestFactory));
			if (authenticationManager != null) {
				tokenGranters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices,
						clientDetails, requestFactory));
			}
			tokenGranter = new CompositeTokenGranter(tokenGranters);
		}
		return tokenGranter;
	}
 
1.3.3.3另外还有一个配置。框架自己提供的URL路径是/oauth/authorize(授权端),/oauth/token (令牌端),/oauth/confirm_access (用户发送确认授权到这里),还有/oauth/error (用户呈现授权服务器授权出错的请求)。这些配置也可以更改。通过pathMapping(...)放来来更改。另外/oauth/authorize这个路径是受spring security保护的,需要授权用户才能访问的,这里是spring security的东西不懂的可以看看这哥们写的spring security翻译 http://lengyun3566.iteye.com/blog/1068998 。很是不错。
 1.3.3.4 配置资源服务器
2.oauth的资源中心
oauth的资源中心主要是放置被oauth所保护的资源。资源中心也是需要配置的,通过这个注解@EnableResourceServer标识这个服务器是资源服务器,并且开启资源服务器的配置。这个注解配置了以后,会自动添加一个过滤器 OAuth2AuthenticationProcessingFilter 
 
3.是oauth的客户端
 

受保护的资源(或称为远程资源)可以使用OAuth2ProtectedResourceDetails类型的实体bean定义。 一个受保护的资源有以下属性:

  • id:资源id。它仅在客户端搜索资源的时候使用;在OAuth协议中它从未被用到。它也被用作bean的id。

  • clientId:OAuth客户端id。OAuth提供端依赖这个id来识别客户端。

    clientId和1.3.1代码中配置的要一致,同时根据clientId也区分不同客户端的授权方式。下面是客户端的配置部分代码。
  • clientSecret:与资源有关的秘密。默认情况下,该值不为空。

  • accessTokenUri:提供访问口令的OAuth提供者终端的统一资源标识符(URI)。

  • scope:以逗号分隔的字符串列表,标识可访问资源的范围。默认情况下,该值为空。

  • clientAuthenticationScheme: 客户端对访问的令牌终端授权时使用的机制。 建议值: "http_basic" 和 "form"。 默认值: "http_basic"。 

 

不同的授权类型有不同的实现OAuth2ProtectedResourceDetails (对于client_credentials授权类型,使用ClientCredentialsResource )的方式。如下面第二段代码。

对于需要进行用户身份验证的授权类型,还有一个属性:

 

  • userAuthorizationUri: 用户访问资源需要身份验证时跳转页面的URI。 注意这个字段不是必填的,它依赖于被支持的OAuth 2的配置文件类型。

		@Bean
		public OAuth2ProtectedResourceDetails sparklr() {
			AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
			details.setId("sparklr/tonr");
			details.setClientId("tonr");
			details.setClientSecret("secret");
			details.setAccessTokenUri(accessTokenUri);
			details.setUserAuthorizationUri(userAuthorizationUri);
			details.setScope(Arrays.asList("read", "write"));
			return details;
		}
                @Bean
		public OAuth2ProtectedResourceDetails trusted() {
			ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
			details.setId("sparklr/trusted");
			details.setClientId("my-client-with-registered-redirect");
			details.setAccessTokenUri(accessTokenUri);
			details.setScope(Arrays.asList("trust"));
			return details;
		}
 
 
使用@EnableOAuth2Client对OAuth2.0的客户端的配置比较简单。主要要做两件事情:
创建一个过滤bean(用oauth2ClientContextFilter)来存储当前的请求和上下文。在这种情况下需要在请求期间授权,来管理从重定向的位置和OAuth已认证的url。
在请求作用域中创建一个AccessTokenRequest类型的bean。这个类型的bean可以在个人用户的冲突中被识别码识别(或隐式的),授权客户端保持授权状态。
这个过滤器需要能够连接到应用(例如,使用Servlet初始化程序或者web.xml配置文件配置 一个和DelegatingFilterProxy相同名称的代理)。
下面是oauth2ClientContextFilter的部分代码。
 
public void doFilter(ServletRequest servletRequest,
			ServletResponse servletResponse, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		request.setAttribute(CURRENT_URI, calculateCurrentUri(request));

		try {
			chain.doFilter(servletRequest, servletResponse);
		} catch (IOException ex) {
			throw ex;
		} catch (Exception ex) {
			// Try to extract a SpringSecurityException from the stacktrace
			Throwable[] causeChain = throwableAnalyzer.determineCauseChain(ex);
			UserRedirectRequiredException redirect = (UserRedirectRequiredException) throwableAnalyzer
					.getFirstThrowableOfType(
							UserRedirectRequiredException.class, causeChain);
			if (redirect != null) {
				redirectUser(redirect, request, response);
			} else {
				if (ex instanceof ServletException) {
					throw (ServletException) ex;
				}
				if (ex instanceof RuntimeException) {
					throw (RuntimeException) ex;
				}
				throw new NestedServletException("Unhandled exception", ex);
			}
		}
	}
 
 
 
 
分享到:
评论

相关推荐

    Spring Security+OAuth2 精讲,打造企业级认证与授权

    Spring Security和OAuth2是两个非常关键的框架,它们分别处理身份验证(Authentication)和授权(Authorization)的问题。本课程"Spring Security+OAuth2 精讲,打造企业级认证与授权"深入浅出地讲解了这两个框架的...

    spring-security-oauth2-2.3.5.RELEASE-API文档-中文版.zip

    赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...

    Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权

    4. **整合Spring Security与OAuth2**:在Spring Boot中,我们可以使用`spring-security-oauth2-autoconfigure`库来简化OAuth2的配置。通过设置`@EnableAuthorizationServer`和`@EnableResourceServer`注解,分别启动...

    spring-boot spring-security-oauth2 完整demo

    《Spring Boot、Spring Security与OAuth2的完整示例解析》 在现代Web开发中,安全性是不可忽视的重要一环。Spring Boot、Spring Security和OAuth2是Java生态系统中用于构建安全Web应用的三大利器。本篇文章将围绕...

    Spring Security+OAuth2 精讲,打造企业级认证与授权2022升级

    Spring Security+OAuth2 精讲,打造企业级认证与授权(2022升级版) 1、企业级认证授权专项解决方案 系统解锁后端开发者必备的"安全"技能 2、主流安全框架核心一网打尽,只学实用的

    spring-security-oauth2源码

    Spring Security OAuth2 是一个强大的框架,用于为Java应用提供OAuth2和OpenID Connect安全功能。OAuth2是一个授权框架,允许第三方应用在用户许可的情况下访问其受保护的资源,而OpenID Connect则是在OAuth2之上...

    spring-security-oauth2-2.3.5.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...

    springsecurity+oauth2+jwt实现单点登录demo

    该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,实现自定义登录页面和自定义授权页面。应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo...

    spring security和oauth2整合开发资料汇总

    Spring Security和OAuth2是两种广泛应用于现代Web应用安全框架的技术。Spring Security是Spring生态系统的组件,主要用于实现身份验证和授权,而OAuth2则是一种开放标准,用于授权第三方应用访问用户资源。下面将...

    Spring security oauth源码

    3. **OAuth2 endpoints**:如`/oauth/authorize`、`/oauth/token`等,用于处理OAuth相关的请求,如用户授权、令牌颁发等。 4. **Resource Server配置**:用于配置资源服务器如何验证访问令牌,通常使用`@...

    springboot+springsecurity+oauth2.zip

    SpringBoot、SpringSecurity和OAuth2是Java开发领域中三个非常重要的技术组件,它们共同构建了安全、高效的应用程序框架。让我们深入探讨这三个组件的核心概念、功能以及如何在实际项目中结合使用。 首先,...

    微信扫一扫登录、微信支付、springsecurity&oauth2

    项目中使用到的技术包含SpringBoot、SpringSecurity&oauth2(安全资源和授权中心模式、包括登录接口自定义返回字段、自定义手机号+密码登录、自定义免密登录)、Queue队列、线程池、xss攻击配置、SpringCache、Mybatis...

    spring-security-oauth2.rar

    Spring Security OAuth2是Spring生态系统中的一个模块,专门用于实现OAuth2规范,为开发者提供了构建安全、可扩展的API服务的能力。 1. **密码模式登录**: 密码模式是OAuth2中的一个授权类型,适用于用户直接登录...

    spring-security-oauth2-2.0.3.jar(包括jar包,源码,doc)

    Spring Security OAuth2是一个广泛使用的Java库,用于在Spring应用程序中实现OAuth2协议,提供安全授权服务。OAuth2是一种授权框架,允许第三方应用在用户许可的情况下访问其私有资源,如在社交媒体上的数据。2.0.3....

    Spring Security OAuth2认证授权示例详解

    Spring Security OAuth2是一个强大的安全框架,它为Web应用程序提供了安全认证和授权的功能。OAuth2则是一种开放标准,允许用户授权第三方应用访问他们存储在另一服务提供商的数据,而无需分享他们的用户名和密码。...

    spring security 基于oauth 2.0 实现 sso 单点登录Demo.zip

    spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth

    基于spring security + oauth2 + jwt ,可优雅集成第三方登录.zip

    Spring Security和OAuth2是两个非常流行的Java安全框架,它们被广泛用于构建安全、可扩展的Web服务。本项目以"基于spring security + oauth2 + jwt,可优雅集成第三方登录"为主题,旨在提供一个能够无缝整合第三方...

    spring-security-oauth2-autoconfigure-2.1.8.RELEASE-文档-中英对照版.zip

    赠送jar包:spring-security-oauth2-autoconfigure-2.1.8.RELEASE.jar; 赠送原API文档:spring-security-oauth2-autoconfigure-2.1.8.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-autoconfigure-...

    视频配套笔记_Spring Security OAuth2.0认证授权_v1.1.rar

    Spring Security OAuth2.0 是一个广泛使用的Java安全框架,它为构建安全的Web应用程序提供了强大的支持。OAuth2.0是授权框架的一个标准,允许第三方应用在用户授权的情况下访问其私有资源,而无需共享用户的登录凭证...

Global site tag (gtag.js) - Google Analytics