SpringSecurity oAuth2.0的四种模式(小结)

 更新时间:2022年02月07日 16:05:01   作者:老梁讲Java  
本文主要介绍了SpringSecurity oAuth2.0的四种模式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.1. 授权码授权模式(Authorization code Grant)

1.1.1. 流程图

1.1.2. 授权服务器配置配置

授权服务器中 client,secret,redirectUri,授权模式,权限配置

//授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends
        AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients)
            throws Exception {
        clients.inMemory()
            .withClient("clientapp")
            .secret("112233")
            .redirectUris("http://localhost:9001/callback")
            // 授权码模式
            .authorizedGrantTypes("authorization_code")
            .scopes("read_userinfo", "read_contacts");
    }

}

1.1.3. 资源服务器配置

配置需要资源授权的接口地址

//资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest()
            .authenticated()
        .and()
            .requestMatchers()
            .antMatchers("/api/**");
    }

}

1.1.4. 操作步骤

浏览器请求下列地址,获取授权code,请求参数client_id,redirect_uri回调地址,response_type响应类型,scope权限

http://localhost:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://localhost:9001/callback&response_type=code&scope=read_userinfo

输入用户名密码,该密码为Spring Security的登路密码,application.properties里配置

# Spring Security Setting
security.user.name=bobo
security.user.password=xyz

登陆后显示

选择Approve,点击Authorize,会调用回调地址并返回code参数

在获得授权码后,接下去获取访问令牌,访问

http://localhost:8080/oauth/token?code=ghN0hF&grant_type=authorization_code&redirect_uri=http://localhost:9001/callback&scope=read_userinfo

注意:需要在headers里添加认证

认证参数就是授权服务器配置的client和secret

 获取token后访问

http://localhost:8080/api/userinfo?access_token=f4345f3a-34a3-4887-bc02-e95150c54bf4

如果token错误,则

1.1.5. 使用场景

授权码模式是最常见的一种授权模式,在oauth2.0内是最安全和最完善的。适用于所有有Server端的应用,如Web站点、有Server端的手机客户端。可以得到较长期限授权。

1.2. 隐式授权模式(Implicit Grant)

1.2.1. 流程图

1.2.2. 改动 authorizedGrantTypes

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthoriationServer extends AuthorizationServerConfigurerAdapter{
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

        clients.inMemory()
                .withClient("clientapp")
                .secret("112233")
                .accessTokenValiditySeconds(60)
                .redirectUris("http://localhost:9001/callback")
                .authorizedGrantTypes("implicit")
                .scopes("admin", "visitor");
    }
}

1.2.3. 操作步骤

申请授权token,参数和申请授权码类似,client_id,redirect_uri回调地址,response_type有变动,改为直接获取token,scope权限,state用于认证标记,传过去什么回调时传回来什么

http://localhost:8080/oauth/authorize?client_id=clientapp&redirect_uri=http://localhost:9001/callback&response_type=token&scope=admin&state=abc

操作同上,输入密码跳转认证确认,选Approve后点Authorize,跳转

3. 可以看到直接返回了access_token,state也是原样返回
4. 之后按授权码模式第六步操作,把access_token参数带上,进行接口调用就可以了

1.2.4. 使用场景

  • 适用于所有无Server端配合的应用
  • 如手机/桌面客户端程序、浏览器插件。
  • 基于JavaScript等脚本客户端脚本语言实现的应用。

注意:因为Access token是附着在 redirect_uri 上面被返回的,所以这个 Access token就可能会暴露给资源所有者或者设置内的其它方(对资源所有者来说,可以看到redirect_uri,对其它方来说,可以通过监测浏览器的地址变化来得到 Access token)。

1.3. 密码模式(Resource Owner Password Credentials Grant)

1.3.1. 流程图

1.3.2. 改动

授权服务器配置,需要添加用户认证管理端点authenticationManager,修改模式authorizedGrantTypes为password

// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthoriationServer extends AuthorizationServerConfigurerAdapter{
    
    @Autowired
    private AuthenticationManager authenticationManager;

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

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

        clients.inMemory()
                .withClient("clientapp")
                .secret("112233")
                .accessTokenValiditySeconds(60)
                .redirectUris("http://localhost:9001/callback")
                .authorizedGrantTypes("password")
                .scopes("admin", "visitor");
    }
}

1.3.3. 操作步骤

调用以下链接,向客户端和服务器提供用户名密码

http://localhost:8080/oauth/token?password=123456&grant_type=password&username=lll&scope=admin

注意:和授权码模式一样,需要在headers里添加认证

结果:

获取token后,步骤同1.1和1.2模式

1.3.4. 使用场景

  • 这种模式适用于用户对应用程序高度信任的情况。比如是用户操作系统的一部分。
  • 认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

1.4. 客户端凭证模式(Client Credentials Grant)

1.4.1. 流程图

1.4.2. 改动

只需修改授权服务器,authorizedGrantTypes类型client_credentials

1.4.3. 操作步骤

http://localhost:8080/oauth/token?grant_type=client_credentials&scope=admin

可以看到客户端凭证模式也需要在header里添加认证账户密码

获得token后操作同上

1.4.4. 使用场景

  • 客户端模式应用于应用程序想要以自己的名义与授权服务器以及资源服务器进行互动。
  • 例如使用了第三方的静态文件服务

1.5. 刷新TOKEN

1.5.1. 流程图

1.5.2. 改动

1.5.3. 操作步骤

以授权码模式为例,步骤同授权码模式,取得授权码后,去取token时,返回

在token过期后,调用

http://localhost:8080/oauth/token?grant_type=refresh_token&refresh_token=ad3941d1-c6dd-4a2e-a9c8-eac6a9a59dd2

返回

就可以拿新的access_token继续调用了建议将access_token和refresh_token的过期时间保存下来,每次调用平台方的业务api前先对access_token和refresh_token进行一下时间判断,如果过期则执行刷新access_token或重新授权操作。refersh_token如果过期就只能让用户重新授权。

参考 https://www.cnblogs.com/maoxiaolv/p/5838680.html

代码学习地址 https://github.com/spring2go/oauth2lab

到此这篇关于SpringSecurity oAuth2.0的四种模式(小结)的文章就介绍到这了,更多相关SpringSecurity oAuth2.0模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在同一个类中调用带有@Transactional注解的方法示例

    在同一个类中调用带有@Transactional注解的方法示例

    这篇文章主要为大家介绍了在同一个类中调用带有@Transactional注解的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java版简单的猜数字游戏实例代码

    java版简单的猜数字游戏实例代码

    猜数字游戏是一款经典的游戏,该游戏说简单也很简单,说不简单确实也很难,那么下面这篇文章主要给大家介绍了java版简单的猜数字游戏的相关资料,文中给出了详细的实现分析和示例代码供大家参考学习,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Java getRealPath(

    Java getRealPath("/")与getContextPath()区别详细分析

    这篇文章主要介绍了Java getRealPath("/")与getContextPath()区别详细分析,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解微信开发之access_token之坑

    详解微信开发之access_token之坑

    access_token分类一是普通access_token,二是网页授权access_token。这篇文章主要介绍了详解微信开发之access_token之坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 使用Enumeration和Iterator遍历集合类详解

    使用Enumeration和Iterator遍历集合类详解

    Enumeration和Iterator接口功能相似,而且Iterator的功能还比Enumeration多,那么为什么还要使用Enumeration
    2013-09-09
  • Java多线程中的Executor框架解析

    Java多线程中的Executor框架解析

    这篇文章主要介绍了Java多线程中的Executor框架解析,Executor 框架是 Java5 之后引进的,在 Java 5 之后,通过 Executor 来启动线程比使用 Thread 的 start 方法更好,除了更易管理,效率更好,需要的朋友可以参考下
    2023-12-12
  • IntelliJ IDEA基于Scala实现Git检查工具

    IntelliJ IDEA基于Scala实现Git检查工具

    这篇文章主要介绍了如何使用Scala实现自定义的Git检查工具,大家可以基于本文的示例进行扩展与实现,也可以进行其他应用方向的尝试,感兴趣的可以了解下
    2023-08-08
  • JAVA宝藏工具hutool的使用

    JAVA宝藏工具hutool的使用

    开发过程中总是会遇到需要自己自定义工具类的情况,做一些数据转换、字符串操作、日期处理、加解密、编解码、金额计算等,本文就详细的介绍有一个工具类hutool的使用,感兴趣的可以了解一下
    2021-10-10
  • 浅析Java验证码生成库JCaptcha

    浅析Java验证码生成库JCaptcha

    JCaptcha 是一个用来生成验证码的开源Java类库,使用起来也是非常的简单方便。本文通过代码实例介绍了JCaptcha类库。
    2016-07-07
  • Java程序打印奥林匹克标志方法详解

    Java程序打印奥林匹克标志方法详解

    这篇文章主要介绍了Java程序打印奥林匹克标志方法详解,需要的朋友可以参考下。
    2017-09-09

最新评论