Spring boot 入门教程-OAuth2

@Bean

public TokenStore tokenStore() {

return new JwtTokenStore(accessTokenConverter());

}

@Bean

@Primary

public DefaultTokenServices tokenServices() {

DefaultTokenServices defaultTokenServices = new DefaultTokenServices();

defaultTokenServices.setTokenStore(tokenStore());

return defaultTokenServices;

}

}

ResourceServer 添加

@Autowired

DefaultTokenServices tokenServices;

@Override

public void configure(ResourceServerSecurityConfigurer resources) {

resources.tokenServices(tokenServices);

}

令牌中添加自定义信息

==========

新建CustomTokenEnhancer  用于在返回token中 添加自定义的信息

public class CustomTokenEnhancer implements TokenEnhancer {

@Override

public OAuth2AccessToken enhance(OAuth2AccessToken accessToken,OAuth2Authentication authentication) {

Map<String, Object> additionalInformation = new HashMap<>();

String userName = authentication.getUserAuthentication().getName();

User user = (User) authentication.getUserAuthentication().getPrincipal();

additionalInformation.put(“userName”, userName);

additionalInformation.put(“roles”, user.getAuthorities());

additionalInformation.put(“organization”, authentication.getName()

// + randomAlphabetic(4)

);

((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInformation);

return accessToken;

}

}

在授权服务中进行配置

@Bean

public TokenEnhancer tokenEnhancer() {

return new CustomTokenEnhancer();

}

@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();

tokenEnhancerChain.setTokenEnhancers(

Arrays.asList(tokenEnhancer(), accessTokenConverter()));

endpoints.tokenStore(tokenStore())

.tokenEnhancer(tokenEnhancerChain)

.authenticationManager(authenticationManager)

.userDetailsService(userDetailsService);

endpoints.accessTokenConverter(accessTokenConverter());

// //自定义授权页

endpoints.pathMapping(“/oauth/confirm_access”, “/confirm”);

}

重新获取token返回如下:

{

“access_token”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ4dXdlaWNoYW8iLCJzY29wZSI6WyJhbGwiXSwicm9sZXMiOlt7ImF1dGhvcml0eSI6IlJPTEVfVVNFUiJ9XSwib3JnYW5pemF0aW9uIjoieHV3ZWljaGFvIiwiZXhwIjoxNTQ1OTgzNTQ5LCJ1c2VyTmFtZSI6Inh1d2VpY2hhbyIsImF1dGhvcml0aWVzIjpbIlJPTEVfVVNFUiJdLCJqdGkiOiI5ODFjNDZiOC04MDk5LTRjYzAtOWU0Zi01NGZjMzdmNjEwNDEiLCJjbGllbnRfaWQiOiJlbGVucy1yYmMifQ.J8cc2UyDU_Ix1VBCq8USHwART1ohnoKguxDxGyoTYQ4”,

“expires_in”: 599,

“jti”: “981c46b8-8099-4cc0-9e4f-54fc37f61041”,

“organization”: “chaorenbuhuifei”,

“refresh_token”: “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJ4dXdlaWNoYW8iLCJzY29wZSI6WyJhbGwiXSwicm9sZXMiOlt7ImF1dGhvcml0eSI6IlJPTEVfVVNFUiJ9XSwib3JnYW5pemF0aW9uIjoieHV3ZWljaGFvIiwiYXRpIjoiOTgxYzQ2YjgtODA5OS00Y2MwLTllNGYtNTRmYzM3ZjYxMDQxIiwiZXhwIjoxNTQ1OTg0MTQ5LCJ1c2VyTmFtZSI6Inh1d2VpY2hhbyIsImF1dGhvcml0aWVzIjpbIlJPTEVfVVNFUiJdLCJqdGkiOiI3ZWYzMTk4MS0xMzhkLTQzZjMtYjhlNS1hOWU1Y2M2Y2E2NTEiLCJjbGllbnRfaWQiOiJlbGVucy1yYmMifQ.rtX61VHhB_7pgz_FD-1wQEadaMzfr-zOI9Uo4I9WKmQ”,

“roles”: [

{

“authority”: “ROLE_USER”

}

],

“scope”: “all”,

“token_type”: “bearer”,

“userName”: “chaorenbuhuifei”

}

这里使用的是对称秘钥的方式签署令牌。生产中一般使用非对称加密的方式。

生成JKS Java KeyStore文件


我们首先使用命令行工具keytool生成密钥 - 更具体地说.jks文件:

keytool -genkeypair -alias mytest

-keyalg RSA

-keypass mypass

-keystore mytest.jks

-storepass mypass

该命令将生成一个名为mytest.jks的文件,其中包含我们的密钥 - 公钥和私钥。 还要确保keypass和storepass是一样的。

导出公钥


接下来,我们需要从生成的JKS中导出我们的公钥,我们可以使用下面的命令来实现:

keytool -list -rfc --keystore mytest.jks | openssl x509 -inform pem -pubkey

示例回应如下所示:

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIK2Wt4x2EtDl41C7vfp

OsMquZMyOyteO2RsVeMLF/hXIeYvicKr0SQzVkodHEBCMiGXQDz5prijTq3RHPy2

/5WJBCYq7yHgTLvspMy6sivXN7NdYE7I5pXo/KHk4nz+Fa6P3L8+L90E/3qwf6j3

DKWnAgJFRY8AbSYXt1d5EzzzzzzzzqzC0fZmNhhfrBtxwWXrlpUDT0Kfvf0QVmPR

xxCLXT+tEe1seWGEqeOLL5vXRLqmzZcBe1RZ9kQQm43+a9Qn5icSRnDfTAesQ3Cr

lAWJKl2kcWU1HwJqw+dZRSZ1X4kEXNMyzPdPBbGmU6MHdhpywI7SKZT7mX4BDnUK

eQIDAQAB

-----END PUBLIC KEY-----

-----BEGIN CERTIFICATE-----

MIIDCzCCAfOgAwIBAgIEGtZIUzANBgkqhkiG9w0BAQsFADA2MQswCQYDVQQGEwJ1

czELMAkGA1UECBMCY2ExCzAJBgNVBAcTAmxhMQ0wCwYDVQQDEwR0ZXN0MB4XDTE2

MDMxNTA4MTAzMFoXDTE2MDYxMzA4MTAzMFowNjELMAkGA1UEBhMCdXMxCzAJBgNV

BAgTAmNhMQswCQYDVQQHEwJsYTENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZIhvcN

AQEBBQADggEPADCCAQoCggEBAICCtlreMdhLQ5eNQu736TrDKrmTMjsrXjtkbFXj

Cxf4VyHmL4nCq9EkMxxxxsassww4o06t0Rz8tv+ViQQmKu8h4Ey77KTM

urIr1zezXWBOyOaV6Pyh5OJ8/hWuj9y/Pi/dBP96sH+o9wylpwICRUWPAG0mF7dX

eRC4iBtf4BKswtH2ZjYYX6wbccFl65aVA09Cn739EFZj0ccQi10/rRHtbHlhhKnj

iy+b10S6ps2XAXtUWfZEEJuN/mvUJ+YnEkZw30wHrENwq5QFiSpdpHFlNR8CasPn

WUUmdV+JBFzTMsz3TwWxplOjB3YacsCO0imU+5l+AQ51CnkCAwEAAaMhMB8wHQYD

VR0OBBYEFOGefUBGquEX9Ujak34PyRskHk+WMA0GCSqGSIb3DQEBCwUAA4IBAQB3

1eLfNeq45yO1cXNl0C1IQLknP2WXg89AHEbKkUOA1ZKTOizNYJIHW5MYJU/zScu0

yBobhTDe5hDTsATMa9sN5CPOaLJwzpWV/ZC6WyhAWTfljzZC6d2rL3QYrSIRxmsp

/J1Vq9WkesQdShnEGy7GgRgJn4A8CKecHSzqyzXulQ7Zah6GoEUD+vjb+BheP4aN

hiYY1OuXD+HsdKeQqS+7eM5U7WW6dz2Q8mtFJ5qAxjY75T0pPrHwZMlJUhUZ+Q2V

FfweJEaoNB9w9McPe1cAiE+oeejZ0jq0el3/dJsx3rlVqZN+lMhRJJeVHFyeb3XF

lLFCUGhA7hxn2xf3x1JW

-----END CERTIFICATE-----

我们只取得我们的公钥,并将其复制到我们的资源服务器src / main / resources / public.txt中

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIK2Wt4x2EtDl41C7vfp

OsMquZMyOyteO2RsVeMLF/hXIeYvicKr0SQzVkodHEBCMiGXQDz5prijTq3RHPy2

/5WJBCYq7yHgTLvspMy6sivXN7NdYE7I5pXo/KHk4nz+Fa6P3L8+L90E/3qwf6j3

DKWnAgJFRY8AbSYXt1d5ELiIG1/gEqzC0fZmNhhfrBtxwWXrlpUDT0Kfvf0QVmPR

xxCLXT+tEe1seWGEqeOLL5vXRLqmzZcBe1RZ9kQQm43+a9Qn5icSRnDfTAesQ3Cr

lAWJKl2kcWU1HwJqw+dZRSZ1X4kEXNMyzPdPBbGmU6MHdhpywI7SKZT7mX4BDnUK

eQIDAQAB

-----END PUBLIC KEY-----

Maven 配置


接下来,我们不希望JMS文件被maven过滤进程拾取 - 所以我们将确保将其排除在pom.xml中:

如果我们使用Spring Boot,我们需要确保我们的JKS文件通过Spring Boot Maven插件添加到应用程序classpath - addResources:

org.springframework.boot

spring-boot-maven-plugin

true

授权服务器


现在,我们将配置JwtAccessTokenConverter使用mytest.jks中的KeyPair,如下所示:

@Bean

public JwtAccessTokenConverter accessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();

KeyStoreKeyFactory keyStoreKeyFactory =

new KeyStoreKeyFactory(new ClassPathResource(“mytest.jks”), “mypass”.toCharArray());

converter.setKeyPair(keyStoreKeyFactory.getKeyPair(“mytest”));

return converter;

}

资源服务器


最后,我们需要配置我们的资源服务器使用公钥 - 如下所示:

@Bean

public JwtAccessTokenConverter accessTokenConverter() {

JwtAccessTokenConverter converter = new JwtAccessTokenConverter();

Resource resource = new ClassPathResource(“public.txt”);

String publicKey = null;

try {

publicKey = IOUtils.toString(resource.getInputStream());

} catch (final IOException e) {

throw new RuntimeException(e);

}

converter.setVerifierKey(publicKey);
return converter;
}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-pFn0KMFL-1714958366156)]

[外链图片转存中…(img-hth1EFx3-1714958366156)]

[外链图片转存中…(img-MG6D4pll-1714958366157)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值