Spring Authorization Server 全新授权服务器整合使用

前言

  • Spring Authorization Server 是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目,旨在替代原有的 Spring Security OAuth

  • 经过半年的开发和孵化,目前已经发布了 0.1.0 版本,初步支持授权码、客户端、刷新、注销等 OAuth 协议

  • 本文环境基于 Spring Boot 2.4.2 && authorization-server 0.1.0

Server 搭建

1. maven 依赖

1<!--oauth2 server--> 2<dependency> 3 <groupId>org.springframework.security.experimental</groupId> 4 <artifactId>spring-security-oauth2-authorization-server</artifactId> 5 <version>0.1.0</version> 6</dependency> 7<!--security dependency--> 8<dependency> 9 <groupId>org.springframework.boot</groupId> 10 <artifactId>spring-boot-starter-security</artifactId> 11</dependency>

2. 初始化配置

  • 由于官方还未提供对应的 Spring Boot Starter 自动化配置,需要自己配置相关的 @Bean

  • 本配置基于 Spring Boot 2.4.2 请知悉

    @Configuration @EnableWebSecurity @Import(OAuth2AuthorizationServerConfiguration.class) public class AuthServerConfiguration {

    1// 定义 spring security 拦击链规则 2@Bean 3SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { 4 http 5 .authorizeRequests(authorizeRequests -> 6 authorizeRequests.anyRequest().authenticated() 7 ) 8 .formLogin(withDefaults()); 9 return http.build(); 10}

    // 创建默认登录用户 lengleng / 123456 @Bean public UserDetailsService userDetailsService() { UserDetails userDetails = User.builder() .username("lengleng") .password("{noop}123456") .authorities("ROLE_USER") .build(); return new InMemoryUserDetailsManager(userDetails); }

    // 创建默认的bean 登录客户端,基于 授权码、 刷新令牌的能力 @Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient client = RegisteredClient.withId("pig") .clientId("pig") .clientSecret("pig") .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC) .authorizationGrantTypes(authorizationGrantTypes -> { authorizationGrantTypes.add(AuthorizationGrantType.AUTHORIZATION_CODE); authorizationGrantTypes.add(AuthorizationGrantType.REFRESH_TOKEN); }) .redirectUri("https://pig4cloud.com") .build(); return new InMemoryRegisteredClientRepository(client); }

    // 指定token 生成的加解密密钥 @Bean @SneakyThrows public JWKSource<SecurityContext> jwkSource() { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

    1 // @formatter:off 2 RSAKey rsaKey= new RSAKey.Builder(publicKey) 3 .privateKey(privateKey) 4 .keyID(UUID.randomUUID().toString()) 5 .build(); 6 JWKSet jwkSet = new JWKSet(rsaKey); 7 return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet); 8}

    }

测试

授权码认证

curl --location --request GET 'http://localhost:3000/oauth2/authorize?client_id=pig&client_secret=pig&response_type=code&redirect_uri=https://pig4cloud.com'

获取令牌

1curl --location --request POST 'http://localhost:3000/oauth2/token' \ 2--header 'Authorization: Basic cGlnOnBpZw==' \ 3--header 'Content-Type: application/x-www-form-urlencoded' \ 4--data-urlencode 'grant_type=authorization_code' \ 5--data-urlencode 'code={code}' \ 6--data-urlencode 'redirect_uri=https://pig4cloud.com'

刷新令牌

1curl --location --request POST 'http://localhost:3000/oauth2/token' \ 2--header 'Authorization: Basic cGlnOnBpZw==' \ 3--header 'Content-Type: application/x-www-form-urlencoded' \ 4--data-urlencode 'grant_type=refresh_token' \ 5--data-urlencode 'refresh_token={refresh_token}' \

撤销令牌

  • 通过 access_token

    curl --location --request POST 'http://localhost:3000/oauth2/revoke'
    --header 'Authorization: Basic cGlnOnBpZw=='
    --header 'Content-Type: application/x-www-form-urlencoded'
    --data-urlencode 'token={access_token}'
    --data-urlencode 'token_type_hint=access_token'

  • 通过 refresh_token

    curl --location --request POST 'http://localhost:3000/oauth2/revoke'
    --header 'Authorization: Basic cGlnOnBpZw=='
    --header 'Content-Type: application/x-www-form-urlencoded'
    --data-urlencode 'token={refresh_token}'
    --data-urlencode 'token_type_hint=refresh_token'

内容扩展 | Token 个性化

  • RegisteredClient 支持个性化 token 设置的入参

    RegisteredClient..tokenSettings()

  • 默认配置如下, 包括令牌有效期,刷新令牌控制等

    1protected static Map<String, Object> defaultSettings() { 2 Map<String, Object> settings = new HashMap<>(); 3 settings.put(ACCESS_TOKEN_TIME_TO_LIVE, Duration.ofMinutes(5)); 4 settings.put(REUSE_REFRESH_TOKENS, true); 5 settings.put(REFRESH_TOKEN_TIME_TO_LIVE, Duration.ofMinutes(60)); 6 return settings; 7}

总结

>>> 源码 https://gitee.com/log4j/pig,欢迎署名转载 <<<

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Spring Security 实战干货:OAuth2第三方授权初体验

1\.前言现在很多项目都有第三方登录或者第三方授权的需求,而最成熟的方案就是OAuth2.0授权协议。SpringSecurity也整合了OAuth2.0,在目前最新的SpringSecurity5中整合了OAuth2.0的客户端,我们可以很方便的使用SpringSecurityOAuth2来实现相关的需求。接下来跟着胖哥