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

  • 更新时间:2022-06-13 09:10:15
  • 编辑:常雅绿
本站精选了一篇Spring相关的编程文章,网友向雅艳根据主题投稿了本篇教程内容,涉及到Spring、Security、OAuth2.0、授权、Spring、Security、OAuth2.0相关内容,已被490网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。
SpringBoot项目如何将jar包打包成war包
  • 大小:108 KB
  • 发布人:邱卷玉
  • 下载:SpringBoot

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

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

其他概念

  1. scope :访问资源服务器的哪些作用域。
  2. 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

客户端信息

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

授权

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

获取的token

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

访问资源服务器API

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

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

相关下载

  • 《Spring Boot从入门到实战》源代码

    大小:4.2 MB
  • 一步一步学Spring Boot 2

    大小:72.04 MB
  • 《Spring in Action(第二版)中文版》源代码

    大小:13.06 MB
  • 《Spring Boot整合开发实战》源代码

    大小:83 MB

相关教程

  • Springboot读取配置文件及自定义配置文件的方法

    Springboot读取配置文件及自定义配置文件的方法

    给大家整理一篇关于Springboot的教程,这篇文章主要介绍了Springboot读取配置文件及自定义配置文件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    发布时间:2022-06-11主题:

    查看详情
  • 利用Spring Cloud Zuul实现动态路由示例代码

    给网友们整理关于Spring Cloud的教程,Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。下面这篇文章主要给大家介绍了关于利用Spring Cloud Zuul实现动态路由的相关资料,需要的朋友可

    发布时间:2022-06-11主题:

    查看详情
  • Spring Security保护用户密码常用方法详解

    Spring Security保护用户密码常用方法详解

    给大家整理一篇关于Spring Security的教程,这篇文章主要介绍了Spring Security保护用户密码常用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    发布时间:2022-06-10主题:Spring Security保护密码

    查看详情
  • SpringBoot中自定义注解实现参数非空校验的示例

    给网友朋友们带来一篇关于SpringBoot的教程,这篇文章主要介绍了SpringBoot中自定义注解实现参数非空校验,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下

    发布时间:2022-06-10主题:SpringBoot 参数非空校验

    查看详情
  • Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

    给网友们整理关于Spring Boot的教程,这篇文章主要介绍了Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    发布时间:2022-06-13主题:

    查看详情
  • SpringMVC Mock测试实现原理及实现过程详解

    给大家整理一篇关于Spring MVC的教程,这篇文章主要介绍了SpringMVC Mock测试实现原理及实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    发布时间:2022-06-10主题:SpringMVC Mock测试

    查看详情
  • Spring中利用配置文件和@value注入属性值代码详解

    给网友朋友们带来一篇关于Spring的教程,这篇文章主要介绍了Spring中利用配置文件和@value注入属性值代码详解,代码中注释比较详细,具有一定参考价值,需要的朋友可以了解下。

    发布时间:2022-06-12主题:

    查看详情
  • spring boot中各个版本的redis配置问题详析

    spring boot中各个版本的redis配置问题详析

    给大家整理了关于spring boot的教程,这篇文章主要给大家介绍了关于spring boot中各个版本的redis配置问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小

    发布时间:2022-06-11主题:

    查看详情

用户留言