,,详解使用Spring Security OAuth 实现OAuth 2.0 授权

,,详解使用Spring Security OAuth 实现OAuth 2.0 授权

本文主要介绍用Spring Security OAuth实现OAuth 2.0授权。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。

OAuth 2.0是一个工业许可协议。OAuth 2.0继承了2006年创建的OAuth 1.0。OAuth 2.0致力于帮助开发者简化授权,为web应用、桌面应用、移动应用和嵌入式应用提供具体的授权流程。

OAuth 2.0是授权的行业标准协议。OAuth 2.0取代了2006年创建的原始OAuth协议。OAuth 2.0关注客户端开发人员的简单性,同时为web应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流。

OAuth 2.0的四个角色

为了方便理解,以微信登录为例。

Resource Owner

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

Resource Server

服务器一般是对用户数据进行一些操作(添加、删除、搜索)的REST API,比如微信获取用户基本信息的接口。

Client Application

相比微信,第三方客户端是微信微信官方账号开发的各类应用。认证服务器授权后,第三方应用可以访问资源服务器的REST API,获取用户头像、性别、地域等基本信息。

Authorization Server

认证服务器验证第三方客户端是否合法。如果合法,则向客户端颁发令牌,第三方通过令牌调用资源服务器的API。

四种授权方式(Grant Type)

anthorization_code

授权码类型,适用于Web服务器应用。方式是:客户端先调用/oauth/authorize/进入用户授权界面,用户授权后返回代码,然后客户端根据代码和appSecret获取访问令牌。

implicit简化类型,相比授权码的类型,获取授权码的步骤更少。在对客户端应用授权之后,认证服务器将直接把访问令牌放在客户端的url中。客户端解析url以获取令牌。其实这种方式并不是很安全,可以通过https安全通道和缩短访问令牌的有效时间来降低风险。

password

类型,客户端应用程序通过用户的用户名和密码获得访问令牌。适用于资源服务器、认证服务器和客户端之间的完全信任关系,因为要将用户的用户名和密码直接发送给客户端应用,客户端应用通过用户发送的用户名和密码获得令牌,然后访问资源服务器的资源。比如支付宝可以用淘宝用户名和密码直接登录,因为两者同属一家公司,彼此完全信任。

client_credentials

客户端类型是一种不需要用户参与的方式,用于连接不同的服务。比如自研应用需要调用短信验证码服务商、地图服务商、手机消息推送服务商的服务。当需要调用服务时,可以直接使用服务提供者给出的appID和appSecret来获取令牌,获取令牌后就可以直接调用服务了。

其他概念

范围:访问资源服务器的哪些范围。

刷新令牌:当访问令牌过期时,可以通过刷新令牌重新获取访问令牌。

实现

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

应用程序的安全配置

@配置

公共类SecurityConfiguration扩展WebSecurityConfigurerAdapter {

@覆盖

受保护的void configure(HttpSecurity http)引发异常{

http.formLogin()。和()。csrf()。禁用()。authorizeRequests()。anyRequest()。已验证();

}

@覆盖

公共void配置(WebSecurity web)引发异常{

super . configure(web);

}

@覆盖

受保护的无效配置(AuthenticationManagerBuilder身份验证)引发异常{

auth.inMemoryAuthentication().withUser('lyt ')。密码(' lyt ').权限('角色_用户)。和()。withUser('admin ').密码(“管理”).权限(' ROLE _ ADMIN ');

}

@Bean

@覆盖

公共认证管理器认证管理器bean()引发异常{

返回超级棒。authenticationmanagerbean();

}

}

认证服务器配置

@EnableAuthorizationServer

@配置

公共类授权服务器配置扩展authorizationserverconfiguuureradapter {

@覆盖

公共void configure(ClientDetailsServiceConfigurer客户端)引发异常{

clients.inMemory().withClient("客户端")。范围("读取"、"写入")。秘密("秘密")。authorizedGrantTypes(' authorization _ code ',' password ',' implicit ',' client _ credentials ');}

@覆盖

公共void configure(AuthorizationServerSecurityConfigurer安全)引发异常{

超级配置(安全);

}

@覆盖

公共空的配置(授权服务器端点配置器端点)引发异常{

端点。authenticationManager(认证管理器);

}

@自动连线

@ Qualifier(' authenticationManagerBean ')

私有AuthenticationManager AuthenticationManager;

}

资源服务器配置

@ EnableGlobalMethodSecurity(prePostEnabled=true)

@EnableResourceServer

@配置

公共类资源服务器配置扩展资源服务器配置适配器{

@覆盖

公共空的配置(http安全性http)引发异常{

http。ant匹配器('/oauth 2/API/* *).authorizeRequests()。antMatchers(HttpMethod .GET,'/read/**).access('#oauth2.hasScope('read ')')。antMatchers(HttpMethod .POST,'/write/**).访问(# oauth 2。有范围(' write ')')。antMatchers(HttpMethod .PUT,'/write/**).访问(# oauth 2。有范围(' write ')')。antMatchers(HttpMethod .删除,'/write/**).访问(# oauth 2。有范围(' write ');

}

}

资源服务器 filter-order 设置

需要在应用程序。yml中将过滤顺序设置成3,具体原因参考链接

防止cookie冲突

为了避免认证服务器的甜饼干和客户端的甜饼干冲突,出现错误,最好修改甜饼干名称或者设置上下文路径。

测试

邮递员中提供OAuth 2.0的认证方式,可以获取到代币之后再把认证加入超文本传送协议(超文本传输协议的缩写)请求中,即可请求资源服务器的REST API

客户端信息

授权

获取的代币

访问资源服务器应用程序接口

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: