亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Spring Security OAuth2實現使用JWT的示例代碼

2024-07-14 08:42:13
字體:
來源:轉載
供稿:網友

1、概括

在博客中,我們將討論如何讓Spring Security OAuth2實現使用JSON Web Tokens。

2、Maven 配置

首先,我們需要在我們的pom.xml中添加spring-security-jwt依賴項。

<dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-jwt</artifactId></dependency>

我們需要為Authorization Server和Resource Server添加spring-security-jwt依賴項。

3、授權服務器

接下來,我們將配置我們的授權服務器使用JwtTokenStore - 如下所示

@Configuration@EnableAuthorizationServerpublic class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {  @Override  public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {    endpoints.tokenStore(tokenStore())         .accessTokenConverter(accessTokenConverter())         .authenticationManager(authenticationManager);  }  @Bean  public TokenStore tokenStore() {    return new JwtTokenStore(accessTokenConverter());  }  @Bean  public JwtAccessTokenConverter accessTokenConverter() {    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();    converter.setSigningKey("123");    return converter;  }  @Bean  @Primary  public DefaultTokenServices tokenServices() {    DefaultTokenServices defaultTokenServices = new DefaultTokenServices();    defaultTokenServices.setTokenStore(tokenStore());    defaultTokenServices.setSupportRefreshToken(true);    return defaultTokenServices;  }}

 請注意,在JwtAccessTokenConverter中使用了一個對稱密鑰來簽署我們的令牌 - 這意味著我們需要為資源服務器使用同樣的確切密鑰。

4、資源服務器

現在,我們來看看我們的資源服務器配置 - 這與授權服務器的配置非常相似:

@Configuration@EnableResourceServerpublic class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {  @Override  public void configure(ResourceServerSecurityConfigurer config) {    config.tokenServices(tokenServices());  }  @Bean  public TokenStore tokenStore() {    return new JwtTokenStore(accessTokenConverter());  }  @Bean  public JwtAccessTokenConverter accessTokenConverter() {    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();    converter.setSigningKey("123");    return converter;  }  @Bean  @Primary  public DefaultTokenServices tokenServices() {    DefaultTokenServices defaultTokenServices = new DefaultTokenServices();    defaultTokenServices.setTokenStore(tokenStore());    return defaultTokenServices;  }}

 請記住,我們將這兩個服務器定義為完全獨立且可獨立部署的服務器。這就是我們需要在新配置中再次聲明一些相同的bean的原因。

5、令牌中的自定義聲明

現在讓我們設置一些基礎設施,以便能夠在訪問令牌中添加一些自定義聲明。框架提供的標準聲明都很好,但大多數情況下我們需要在令牌中使用一些額外的信息來在客戶端使用。 我們將定義一個TokenEnhancer來定制我們的Access Token與這些額外的聲明。 在下面的例子中,我們將添加一個額外的字段“組織”到我們的訪問令牌 - 與此CustomTokenEnhancer:

public class CustomTokenEnhancer implements TokenEnhancer {  @Override  public OAuth2AccessToken enhance(   OAuth2AccessToken accessToken,    OAuth2Authentication authentication) {    Map<String, Object> additionalInfo = new HashMap<>();    additionalInfo.put("organization", authentication.getName() + randomAlphabetic(4));    ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);    return accessToken;  }}

然后,我們將把它連接到我們的授權服務器配置 - 如下所示:

@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {  TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();  tokenEnhancerChain.setTokenEnhancers(   Arrays.asList(tokenEnhancer(), accessTokenConverter()));  endpoints.tokenStore(tokenStore())       .tokenEnhancer(tokenEnhancerChain)       .authenticationManager(authenticationManager);}@Beanpublic TokenEnhancer tokenEnhancer() {  return new CustomTokenEnhancer();}

有了這個新的配置啟動和運行 - 這是一個令牌令牌有效載荷看起來像:

{  "user_name": "john",  "scope": [    "foo",    "read",    "write"  ],  "organization": "johnIiCh",  "exp": 1458126622,  "authorities": [    "ROLE_USER"  ],  "jti": "e0ad1ef3-a8a5-4eef-998d-00b26bc2c53f",  "client_id": "fooClientIdPassword"}

5.1、在JS客戶端使用訪問令牌

最后,我們要在AngualrJS客戶端應用程序中使用令牌信息。我們將使用angular-jwt庫。 所以我們要做的就是在index.html中使用“組織”聲明:

<p class="navbar-text navbar-right">{{organization}}</p><script type="text/javascript" src="https://cdn.rawgit.com/auth0/angular-jwt/master/dist/angular-jwt.js"></script><script>var app = angular.module('myApp', ["ngResource","ngRoute", "ngCookies", "angular-jwt"]);app.controller('mainCtrl', function($scope, $cookies, jwtHelper,...) {  $scope.organiztion = "";  function getOrganization(){    var token = $cookies.get("access_token");    var payload = jwtHelper.decodeToken(token);    $scope.organization = payload.organization;  }  ...});

6、不對稱的KeyPair

在我們以前的配置中,我們使用對稱密鑰來簽署我們的令牌:

@Beanpublic JwtAccessTokenConverter accessTokenConverter() {  JwtAccessTokenConverter converter = new JwtAccessTokenConverter();  converter.setSigningKey("123");  return converter;}

我們還可以使用非對稱密鑰(公鑰和私鑰)來執行簽名過程。

6.1、生成JKS Java KeyStore文件

我們首先使用命令行工具keytool生成密鑰 - 更具體地說.jks文件:

keytool -genkeypair -alias mytest           -keyalg RSA           -keypass mypass           -keystore mytest.jks           -storepass mypass

該命令將生成一個名為mytest.jks的文件,其中包含我們的密鑰 - 公鑰和私鑰。 還要確保keypass和storepass是一樣的。

6.2、導出公鑰

接下來,我們需要從生成的JKS中導出我們的公鑰,我們可以使用下面的命令來實現:

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

示例回應如下所示:

-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIK2Wt4x2EtDl41C7vfpOsMquZMyOyteO2RsVeMLF/hXIeYvicKr0SQzVkodHEBCMiGXQDz5prijTq3RHPy2/5WJBCYq7yHgTLvspMy6sivXN7NdYE7I5pXo/KHk4nz+Fa6P3L8+L90E/3qwf6j3DKWnAgJFRY8AbSYXt1d5ELiIG1/gEqzC0fZmNhhfrBtxwWXrlpUDT0Kfvf0QVmPRxxCLXT+tEe1seWGEqeOLL5vXRLqmzZcBe1RZ9kQQm43+a9Qn5icSRnDfTAesQ3CrlAWJKl2kcWU1HwJqw+dZRSZ1X4kEXNMyzPdPBbGmU6MHdhpywI7SKZT7mX4BDnUKeQIDAQAB-----END PUBLIC KEY----------BEGIN CERTIFICATE-----MIIDCzCCAfOgAwIBAgIEGtZIUzANBgkqhkiG9w0BAQsFADA2MQswCQYDVQQGEwJ1czELMAkGA1UECBMCY2ExCzAJBgNVBAcTAmxhMQ0wCwYDVQQDEwR0ZXN0MB4XDTE2MDMxNTA4MTAzMFoXDTE2MDYxMzA4MTAzMFowNjELMAkGA1UEBhMCdXMxCzAJBgNVBAgTAmNhMQswCQYDVQQHEwJsYTENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAICCtlreMdhLQ5eNQu736TrDKrmTMjsrXjtkbFXjCxf4VyHmL4nCq9EkM1ZKHRxAQjIhl0A8+aa4o06t0Rz8tv+ViQQmKu8h4Ey77KTMurIr1zezXWBOyOaV6Pyh5OJ8/hWuj9y/Pi/dBP96sH+o9wylpwICRUWPAG0mF7dXeRC4iBtf4BKswtH2ZjYYX6wbccFl65aVA09Cn739EFZj0ccQi10/rRHtbHlhhKnjiy+b10S6ps2XAXtUWfZEEJuN/mvUJ+YnEkZw30wHrENwq5QFiSpdpHFlNR8CasPnWUUmdV+JBFzTMsz3TwWxplOjB3YacsCO0imU+5l+AQ51CnkCAwEAAaMhMB8wHQYDVR0OBBYEFOGefUBGquEX9Ujak34PyRskHk+WMA0GCSqGSIb3DQEBCwUAA4IBAQB31eLfNeq45yO1cXNl0C1IQLknP2WXg89AHEbKkUOA1ZKTOizNYJIHW5MYJU/zScu0yBobhTDe5hDTsATMa9sN5CPOaLJwzpWV/ZC6WyhAWTfljzZC6d2rL3QYrSIRxmsp/J1Vq9WkesQdShnEGy7GgRgJn4A8CKecHSzqyzXulQ7Zah6GoEUD+vjb+BheP4aNhiYY1OuXD+HsdKeQqS+7eM5U7WW6dz2Q8mtFJ5qAxjY75T0pPrHwZMlJUhUZ+Q2VFfweJEaoNB9w9McPe1cAiE+oeejZ0jq0el3/dJsx3rlVqZN+lMhRJJeVHFyeb3XFlLFCUGhA7hxn2xf3x1JW-----END CERTIFICATE-----

我們只取得我們的公鑰,并將其復制到我們的資源服務器src / main / resources / public.txt中

-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIK2Wt4x2EtDl41C7vfpOsMquZMyOyteO2RsVeMLF/hXIeYvicKr0SQzVkodHEBCMiGXQDz5prijTq3RHPy2/5WJBCYq7yHgTLvspMy6sivXN7NdYE7I5pXo/KHk4nz+Fa6P3L8+L90E/3qwf6j3DKWnAgJFRY8AbSYXt1d5ELiIG1/gEqzC0fZmNhhfrBtxwWXrlpUDT0Kfvf0QVmPRxxCLXT+tEe1seWGEqeOLL5vXRLqmzZcBe1RZ9kQQm43+a9Qn5icSRnDfTAesQ3CrlAWJKl2kcWU1HwJqw+dZRSZ1X4kEXNMyzPdPBbGmU6MHdhpywI7SKZT7mX4BDnUKeQIDAQAB-----END PUBLIC KEY-----

6.3、Maven 配置

接下來,我們不希望JMS文件被maven過濾進程拾取 - 所以我們將確保將其排除在pom.xml中:

<build>  <resources>    <resource>      <directory>src/main/resources</directory>      <filtering>true</filtering>      <excludes>        <exclude>*.jks</exclude>      </excludes>    </resource>  </resources></build>

如果我們使用Spring Boot,我們需要確保我們的JKS文件通過Spring Boot Maven插件添加到應用程序classpath - addResources:

<build>  <plugins>    <plugin>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-maven-plugin</artifactId>      <configuration>        <addResources>true</addResources>      </configuration>    </plugin>  </plugins></build>

6.4、授權服務器

現在,我們將配置JwtAccessTokenConverter使用mytest.jks中的KeyPair,如下所示:

@Beanpublic JwtAccessTokenConverter accessTokenConverter() {  JwtAccessTokenConverter converter = new JwtAccessTokenConverter();  KeyStoreKeyFactory keyStoreKeyFactory =    new KeyStoreKeyFactory(new ClassPathResource("mytest.jks"), "mypass".toCharArray());  converter.setKeyPair(keyStoreKeyFactory.getKeyPair("mytest"));  return converter;}

6.5、資源服務器

最后,我們需要配置我們的資源服務器使用公鑰 - 如下所示:

@Beanpublic 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;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久这里有精品| 茄子视频成人在线| 日本一区二区三区四区视频| 久久国产精品网站| 97视频在线看| 国产精品丝袜久久久久久不卡| 国产精品一久久香蕉国产线看观看| 久久久成人精品| 国产精品美女999| 亚洲爱爱爱爱爱| 国内精品久久久久久影视8| 欧美人与物videos| 亚洲va久久久噜噜噜久久天堂| 精品国产乱码久久久久久婷婷| 久久精品91久久香蕉加勒比| 97av视频在线| 国产精品久久久久久久久久久久久久| xvideos成人免费中文版| 国产欧美va欧美va香蕉在线| 欧美床上激情在线观看| 欧美激情一级欧美精品| 日韩一区二区在线视频| xvideos亚洲| 亚洲亚裔videos黑人hd| 欧美高清电影在线看| 亚洲精品久久久久国产| 狠狠色狠色综合曰曰| 久久免费观看视频| 欧美黄色成人网| 欧美大尺度激情区在线播放| 久久91精品国产91久久跳| 欧美中文字幕在线视频| 色婷婷**av毛片一区| 国产成人中文字幕| 欧美日韩成人黄色| 欧美日韩xxxxx| 色七七影院综合| 日韩av日韩在线观看| 97国产一区二区精品久久呦| 亚洲天堂av综合网| 91高清视频免费观看| 国产精品偷伦免费视频观看的| 成人h视频在线观看播放| 在线观看不卡av| 久久久久久久久久亚洲| 日韩中文字幕在线观看| 亚洲成**性毛茸茸| 在线色欧美三级视频| 国产精品十八以下禁看| 国产精品白嫩美女在线观看| 国产偷国产偷亚洲清高网站| 狠狠色狠色综合曰曰| 91香蕉嫩草影院入口| 欧美精品在线第一页| 亚洲人成电影网站色www| 亚洲男女自偷自拍图片另类| 亚洲综合第一页| 欧美孕妇孕交黑巨大网站| 日韩av不卡在线| 欧美性在线观看| 激情成人中文字幕| 日韩av电影国产| 久久久久久亚洲精品中文字幕| 97人人模人人爽人人喊中文字| 国产精品av免费在线观看| 亚洲国产欧美日韩精品| 国产最新精品视频| 国产精品久久久久久久久久三级| 亚洲免费伊人电影在线观看av| 亚洲最新中文字幕| 亚洲第一页在线| 国产精品99一区| 国产精品电影一区| 国产精品美腿一区在线看| 人体精品一二三区| 国产精品久久久久久中文字| 九九热r在线视频精品| 伊人久久久久久久久久| 国产一区二区三区丝袜| 国内精品一区二区三区四区| 欧美激情在线观看| 青青久久av北条麻妃海外网| y97精品国产97久久久久久| 国产女人18毛片水18精品| 国产福利精品在线| 国产精品网站视频| 日韩在线观看免费高清完整版| 亚洲性日韩精品一区二区| 色偷偷av一区二区三区| 亚洲国产精品小视频| 亚洲第一网站男人都懂| 欧美一级淫片aaaaaaa视频| 精品福利樱桃av导航| 最近2019年手机中文字幕| 亚洲free性xxxx护士白浆| 国产精品福利在线观看网址| 亚洲综合在线中文字幕| 国产99视频在线观看| 97涩涩爰在线观看亚洲| 亚洲男女自偷自拍图片另类| 亚洲欧美另类中文字幕| 在线观看日韩www视频免费| 91爱视频在线| 欧美成年人视频| 国产精品一区久久| 欧美激情在线有限公司| 欧美另类极品videosbestfree| 国产一级揄自揄精品视频| 欧美日韩另类字幕中文| 欧美性生交xxxxx久久久| 亚洲美女在线视频| 欧美日韩国产中文精品字幕自在自线| 亚洲片国产一区一级在线观看| 国产成人精品一区二区| 欧美成人免费在线观看| **欧美日韩vr在线| 欧美亚洲在线视频| 91在线观看免费观看| 亚洲国产精品悠悠久久琪琪| 国产97在线|日韩| 久久久成人精品| 欧美成人午夜影院| 日韩精品久久久久久福利| 久久久久免费视频| 亚洲欧美变态国产另类| 日韩在线www| 久久99精品久久久久久琪琪| 高跟丝袜欧美一区| 国产在线观看不卡| 国产精品久久久久久久一区探花| 亚洲精品xxxx| 69精品小视频| 中文字幕国产亚洲| 精品亚洲一区二区三区四区五区| 97在线观看免费高清| 久久男人资源视频| 精品亚洲一区二区三区在线观看| 欧美韩国理论所午夜片917电影| 国产精品99久久99久久久二8| 欧美专区日韩视频| 亚洲精品98久久久久久中文字幕| 国产成人精品午夜| 亚洲精品有码在线| 国产精品99久久久久久久久| 久久免费福利视频| 国产精品27p| 亚洲男人第一网站| 国产精品久久久久久久久久久新郎| 国产日韩综合一区二区性色av| 国产欧美日韩免费看aⅴ视频| 最近中文字幕mv在线一区二区三区四区| 欧美日韩免费在线| 懂色av一区二区三区| 亚洲最大福利视频网| 亚洲少妇中文在线| 久久久久亚洲精品成人网小说| 国产精品1区2区在线观看| 成人黄色免费片| 欧美性xxxx在线播放| 国产精品男人的天堂| 91福利视频在线观看| 欧美日韩国产在线播放| 亚洲精品av在线| 欧美特黄级在线|