最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security OAuth2實現(xiàn)使用JWT的示例代碼

 更新時間:2018年09月03日 11:00:20   作者:不想當(dāng)碼農(nóng)的程序員  
這篇文章主要介紹了Spring Security OAuth2實現(xiàn)使用JWT的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、概括

在博客中,我們將討論如何讓Spring Security OAuth2實現(xiàn)使用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、授權(quán)服務(wù)器

接下來,我們將配置我們的授權(quán)服務(wù)器使用JwtTokenStore - 如下所示

@Configuration
@EnableAuthorizationServer
public 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中使用了一個對稱密鑰來簽署我們的令牌 - 這意味著我們需要為資源服務(wù)器使用同樣的確切密鑰。

4、資源服務(wù)器

現(xiàn)在,我們來看看我們的資源服務(wù)器配置 - 這與授權(quán)服務(wù)器的配置非常相似:

@Configuration
@EnableResourceServer
public 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;
  }
}

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

5、令牌中的自定義聲明

現(xiàn)在讓我們設(shè)置一些基礎(chǔ)設(shè)施,以便能夠在訪問令牌中添加一些自定義聲明??蚣芴峁┑臉?biāo)準(zhǔn)聲明都很好,但大多數(shù)情況下我們需要在令牌中使用一些額外的信息來在客戶端使用。 我們將定義一個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;
  }
}

然后,我們將把它連接到我們的授權(quán)服務(wù)器配置 - 如下所示:

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

@Bean
public 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客戶端應(yīng)用程序中使用令牌信息。我們將使用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

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

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

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

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、導(dǎo)出公鑰

接下來,我們需要從生成的JKS中導(dǎo)出我們的公鑰,我們可以使用下面的命令來實現(xiàn):

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

示例回應(yīng)如下所示:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgIK2Wt4x2EtDl41C7vfp
OsMquZMyOyteO2RsVeMLF/hXIeYvicKr0SQzVkodHEBCMiGXQDz5prijTq3RHPy2
/5WJBCYq7yHgTLvspMy6sivXN7NdYE7I5pXo/KHk4nz+Fa6P3L8+L90E/3qwf6j3
DKWnAgJFRY8AbSYXt1d5ELiIG1/gEqzC0fZmNhhfrBtxwWXrlpUDT0Kfvf0QVmPR
xxCLXT+tEe1seWGEqeOLL5vXRLqmzZcBe1RZ9kQQm43+a9Qn5icSRnDfTAesQ3Cr
lAWJKl2kcWU1HwJqw+dZRSZ1X4kEXNMyzPdPBbGmU6MHdhpywI7SKZT7mX4BDnUK
eQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIDCzCCAfOgAwIBAgIEGtZIUzANBgkqhkiG9w0BAQsFADA2MQswCQYDVQQGEwJ1
czELMAkGA1UECBMCY2ExCzAJBgNVBAcTAmxhMQ0wCwYDVQQDEwR0ZXN0MB4XDTE2
MDMxNTA4MTAzMFoXDTE2MDYxMzA4MTAzMFowNjELMAkGA1UEBhMCdXMxCzAJBgNV
BAgTAmNhMQswCQYDVQQHEwJsYTENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAICCtlreMdhLQ5eNQu736TrDKrmTMjsrXjtkbFXj
Cxf4VyHmL4nCq9EkM1ZKHRxAQjIhl0A8+aa4o06t0Rz8tv+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-----

我們只取得我們的公鑰,并將其復(fù)制到我們的資源服務(wù)器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-----

6.3、Maven 配置

接下來,我們不希望JMS文件被maven過濾進(jìn)程拾取 - 所以我們將確保將其排除在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插件添加到應(yīng)用程序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、授權(quán)服務(wù)器

現(xiàn)在,我們將配置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;
}

6.5、資源服務(wù)器

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Netty進(jìn)階之EventExecutorGroup源碼詳解

    Netty進(jìn)階之EventExecutorGroup源碼詳解

    這篇文章主要介紹了Netty進(jìn)階之EventExecutorGroup源碼詳解,EventExecutorGroup繼承了JDK的ScheduledExecutroService,那么它就擁有了執(zhí)行定時任務(wù),執(zhí)行提交的普通任務(wù),需要的朋友可以參考下
    2023-11-11
  • Redis內(nèi)存數(shù)據(jù)庫示例分析

    Redis內(nèi)存數(shù)據(jù)庫示例分析

    Redis本身的內(nèi)容比較復(fù)雜。如果你上來,你應(yīng)該研究一個細(xì)節(jié)點,比如連接池和數(shù)據(jù)結(jié)構(gòu)。雖然可以直接了解某一點的詳細(xì)來源內(nèi)容,甚至盡快解決一些意外,但是容易淹沒在失眠的細(xì)節(jié)中,整體控制不了Redis
    2022-12-12
  • MyBatis框架簡介及入門案例詳解

    MyBatis框架簡介及入門案例詳解

    MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過程代碼,本文將作為最終篇為大家介紹MyBatis的使用
    2022-08-08
  • springboot3集成mybatis-plus報sqlSession異常的問題解決

    springboot3集成mybatis-plus報sqlSession異常的問題解決

    springboot3已經(jīng)發(fā)布正式版,但是在集成mybatis-plus最新版3.5.2的時候發(fā)現(xiàn)提示異常,本文就來介紹一下報sqlSession異常的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • MyBatis-Plus配置未生效的問題及解決

    MyBatis-Plus配置未生效的問題及解決

    本文主要探討了在使用MyBatis-Plus進(jìn)行數(shù)據(jù)庫操作時遇到的問題,包括SQL語句未生效、Mapper接口未掃描、屬性未注入、Bean未注冊等問題,通過分析SpringBoot的配置類加載機(jī)制,本文提出了兩種解決方案:添加@Configuration注解和使用AutoConfiguration.imports文件
    2025-12-12
  • java 中斷線程的幾種方式 interrupt()詳解

    java 中斷線程的幾種方式 interrupt()詳解

    中斷(Interrupt)一個線程意味著在該線程完成任務(wù)之前停止其正在進(jìn)行的一切,有效地中止其當(dāng)前的操作。這篇文章主要介紹了java 中斷線程的幾種方式 interrupt(),需要的朋友可以參考下
    2021-11-11
  • MybatisPlus中saveBatch方法的使用

    MybatisPlus中saveBatch方法的使用

    本文介紹了MyBatisPlus中的saveBatch方法的使用及其實現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • java ThreadPoolExecutor線程池拒絕策略避坑

    java ThreadPoolExecutor線程池拒絕策略避坑

    這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • spring中@Reference注入為空的解決方法

    spring中@Reference注入為空的解決方法

    今天上線遇到了問題,所以抽空記錄一下,本文主要介紹了spring中@Reference注入為空的解決方法,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Mybatis的詳細(xì)使用教程

    Mybatis的詳細(xì)使用教程

    這篇文章主要介紹了Mybatis的詳細(xì)使用教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12

最新評論

湟源县| 陆丰市| 韶山市| 福安市| 恩施市| 健康| 鱼台县| 邯郸县| 陈巴尔虎旗| 民勤县| 收藏| 鹤庆县| 醴陵市| 麻江县| 红安县| 绵阳市| 社旗县| 晋中市| 青川县| 上杭县| 北京市| 城口县| 东光县| 涿鹿县| 自贡市| 唐海县| 花垣县| 威海市| 盐亭县| 通山县| 睢宁县| 云梦县| 永和县| 额敏县| 全南县| 巩留县| 庆安县| 三穗县| 济南市| 商都县| 安陆市|