文档章节

Spring Security OAuth 实现OAuth 2.0 授权

刘亚涛
 刘亚涛
发布于 01/12 09:45
字数 1240
阅读 732
收藏 51

OAuth 2.0 简介

OAuth 2.0是一种工业级的授权协议。OAuth 2.0是从创建于2006年的OAuth 1.0继承而来的。OAuth 2.0致力于帮助开发者简化授权并为web应用、桌面应用、移动应用、嵌入式应用提供具体的授权流程。

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.

OAuth 2.0的四个角色

为了方便理解,以常用的使用微信登录为例

  • Resource Owner

    资源拥有者,对应微信的每个用户微信上设置的个人信息是属于每个用户的,不属于腾讯。

  • Resource Server

    资源服务器,一般就是用户数据的一些操作(增删改查)的REST API,比如微信的获取用户基本信息的接口。

  • Client Application

    第三方客户端,对比微信中就是各种微信公众号开发的应用,第三方应用经过认证服务器授权后即可访问资源服务器的REST API来获取用户的头像、性别、地区等基本信息。

  • Authorization Server

    认证服务器,验证第三方客户端是否合法。如果合法就给客户端颁布token,第三方通过token来调用资源服务器的API。

四种授权方式(Grant Type)

  • anthorization_code

    授权码类型,适用于Web Server Application。模式为:客户端先调用/oauth/authorize/进到用户授权界面,用户授权后返回code,客户端然后根据code和appSecret获取access token

  • implicit 简化类型,相对于授权码类型少了授权码获取的步骤。客户端应用授权后认证服务器会直接将access token放在客户端的url。客户端解析url获取token。这种方式其实是不太安全的,可以通过https安全通道缩短access token的有效时间来较少风险。

  • password

    密码类型,客户端应用通过用户的username和password获access token。适用于资源服务器、认证服务器与客户端具有完全的信任关系,因为要将用户要将用户的用户名密码直接发送给客户端应用,客户端应用通过用户发送过来的用户名密码获取token,然后访问资源服务器资源。比如支付宝就可以直接用淘宝用户名和密码登录,因为它们属于同一家公司,彼此充分信任

  • client_credentials

    客户端类型,是不需要用户参与的一种方式,用于不同服务之间的对接。比如自己开发的应用程序要调用短信验证码服务商的服务,调用地图服务商的服务、调用手机消息推送服务商的服务。当需要调用服务是可以直接使用服务商给的appIDappSecret来获取token,得到token之后就可以直接调用服务。

其他概念

  • scope:访问资源服务器的哪些作用域。
  • refresh token:当access token 过期后,可以通过refresh token重新获取access token。

实现

有的时候资源服务器和认证服务器是两个不同的应用,有的时候资源服务器和认证服务器在通一个应用中,不同之处在于资源服务器是否需要检查token的有效性,前者需要检查,后者不需要。这里实现后者。

Application的安全配置

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .and().csrf().disable()
                .authorizeRequests().anyRequest().authenticated();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("lyt").password("lyt").authorities("ROLE_USER")
                .and().withUser("admin").password("admin").authorities("ROLE_ADMIN");
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

认证服务器配置

@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration  extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("client")
                .scopes("read","write")
                .secret("secret")
                .authorizedGrantTypes("authorization_code","password","implicit","client_credentials");}

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        super.configure(security);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
       endpoints.authenticationManager(authenticationManager);
    }

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

资源服务器配置

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableResourceServer
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
	@Override
	public void configure(HttpSecurity http) throws Exception {
		http.antMatcher("/oauth2/api/**").authorizeRequests()
			.antMatchers(HttpMethod.GET, "/read/**").access("#oauth2.hasScope('read')")
			.antMatchers(HttpMethod.POST, "/write/**").access("#oauth2.hasScope('write')")
			.antMatchers(HttpMethod.PUT, "/write/**").access("#oauth2.hasScope('write')")
			.antMatchers(HttpMethod.DELETE, "/write/**").access("#oauth2.hasScope('write')");
	}

}

资源服务器filter-order设置

需要在application.yml中将filter-order设置成3,具体原因参考 链接

防止cookie冲突

为了避免认证服务器的cookie和客户端的cookie冲突,出现错误,最好修改cookie name 或者设置contextPath

测试

postman中提供OAuth 2.0的认证方式,可以获取到token之后再把认证加入http请求中,即可请求资源服务器的REST API

  • 客户端信息

输入图片说明

  • 授权

输入图片说明

  • 获取的token

输入图片说明

  • 访问资源服务器API

输入图片说明

最后

测试代码github地址。有兴趣可以关注微信公众账号获取最新推送文章。

输入图片说明

© 著作权归作者所有

共有 人打赏支持
刘亚涛
粉丝 20
博文 7
码字总数 17647
作品 0
武汉
程序员
加载中

评论(1)

MGL_TECH
MGL_TECH
mark
【OAuth2学习之路】Spring Security OAuth官网文档翻译

现将开发文档翻译出来,因为看英文实在是比较吃力的。 首先看下官方的指南Developers Guide,OAuth的两个版都都有。本文看的是OAuth2的开发指南。 翻译如下: Spring Security OAuth2开发指南...

666B
2014/09/09
0
0
SpringCloud实践分享-OAuth2认证中心(待完成)

摘要:随着云计算的发展,微服务、前后端分离、DevOps逐渐成为架构主流。而不同于以往的单体应用,微服务大多仅以api形式专递信息,并且无状态(不记录用户登录状态及会话内容),这就为整个...

杨子敬的瞎扯时刻
06/11
0
0
Spring Security OAuth2 SSO

通常公司肯定不止一个系统,每个系统都需要进行认证和权限控制,不可能每个每个系统都自己去写,这个时候需要把登录单独提出来 登录和授权是统一的 业务系统该怎么写还怎么写 最近学习了一下...

不要乱摸
07/11
0
0
一步一步构建自己的管理系统① 之 Spring Security OAuth + jwt

现在Spring boot 极大的简化了 Spring Framework 应用程序的配置,通过简单的依赖配置即可实现程序的基本安全。 首先我们先了解一下 oauth 2.0 OAuth 2.0 的规范可以参考 : RFC 6749 OAuth...

Fly_f
04/15
0
0
Spring Security Oauth 2.3.2 发布

spring-security-oauth 2.3.2 发布,目前暂未发现更新信息,您可查看发布主页保持关注。 Spring Security OAuth 是 Spring Security 的 OAuth 插件,同时提供了 OAuth 客户端(consumer)和服务...

淡漠悠然
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java序列化(七) - fst 序列化

java序列化(七) - fst 序列化 github https://github.com/RuedigerMoeller/fast-serialization 实践 https://gitee.com/mengzhang6/serializable-demo.git maven依赖 <!-- https://mvnrepo......

晨猫
2分钟前
0
0
智力问题汇总

南京新建地铁线路,给你2块钱,测出来需要配置多少辆车? 参考答案:根据地铁有固定时间间隔,坐一圈该线路,推算出需要多少辆。 一共50张卡片,上面写着1--50 ,50个数字,藏起来一张,打乱...

职业搬砖20年
6分钟前
0
0
ZFS-自我恢复RAID

ZFS-自我恢复RAID 这个给了我一个简单而又强大的理由,让我立马为之折服,ZFS可以自动的检测发生的错误,而且,可以自我修复这些错误。假设有一个时刻,磁盘阵列中的数据是错误的,不管是什么...

openthings
15分钟前
1
0
从Hash到一致性Hash原理(深度好文)

要讲一致性Hash原理,先从一般性Hash讲起,其实Hash的本质就是一个长度可变的数组,那为什么Hash的时间复杂度是O(1),而其他类型的数据结构查找都是要遍历来,遍历去,即便是树,二叉树,也是要经过几...

算法之名
28分钟前
8
0
软件测试工具书籍与面试题汇总下载(持续更新)

简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md 的节选。 欢迎转载,转载请附带此简介,谢谢! 试题 软件测试综合面试题(高级测试)-试题.pdf 软件测试...

python测试开发人工智能安全
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部