本文主要介绍用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。