paulwong

          #

          OAUTH2 - 4流程如何選擇?





          https://developer.okta.com/docs/concepts/oauth-openid/#what-kind-of-client-are-you-building

          posted @ 2022-01-06 13:37 paulwong 閱讀(143) | 評論 (0)編輯 收藏

          幾個好看的免費UI

          https://demos.creative-tim.com/light-bootstrap-dashboard-angular2/#/dashboard


          https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2

          https://www.creative-tim.com/templates/angular-dashboard-bootstrap

          https://coreui.io/angular/demo/free/2.11.1/#/base/tables

          posted @ 2022-01-04 15:36 paulwong 閱讀(185) | 評論 (0)編輯 收藏

          Easily Secure your Microservices with Keycloak

          https://www.doag.org/formes/pubfiles/11143470/2019-NN-Sebastien_Blanc-Easily_Secure_your_Microservices_with_Keycloak-Praesentation.pdf

          posted @ 2022-01-03 10:03 paulwong 閱讀(148) | 評論 (0)編輯 收藏

          REDHEAD 7 LINUX 軟件集合

          https://www.softwarecollections.org/en/

          不用再GOOGLE尋找安裝方法。

          安裝MYSQL示例:
          # 2. Install the collection:
          $ sudo yum install rh-mariadb103

          # 3. Start using software collections:
          $ scl enable rh-mariadb103 bash

          $ service rh-mariadb103-mariadb start 
          $ mysql
          $ mysqld

          #開機加載命令
          cp /opt/rh/rh-mariadb103/enable /etc/profile.d/rh-mariadb103.sh

          posted @ 2021-12-22 14:28 paulwong 閱讀(199) | 評論 (0)編輯 收藏

          OIDC - KEYCLOAK - 自定義CLIENT SCOPE

          當CLIENT或用戶在KEYCLOAK中成功登錄后,會返回JWT字符串,其中默認含有權限的信息,但此信息以內嵌的方式呈現,非常不方便。
          "resource_access": {
              "app-springboot-confidential": {
                "roles": [
                  "user"
                ]
              },
              "test-employee-service": {
                "roles": [
                  "READ_EMPLOYEE"
                ]
              },
              "service-springboot": {
                "roles": [
                  "READ_PRODUCTS"
                ]
              },
              "account": {
                "roles": [
                  "manage-account",
                  "manage-account-links"
                ]
              },
              "test-department-service": {
                "roles": [
                  "READ_DEPARTMENT"
                ]
              }
            }

          • 需要將權限的信息輸出到一個KEY中,這時可以新增自定義CLIENT SCOPE。Mapper中新增KEYCLOAK已內置的【realm roles/client roles】,定義輸出到JTW的字段名:my-roles。
          • 授權哪些CLIENT可以讀取此CLIENT SCOPE.
          • 在登錄參數scope中,加入此值:my-roles,這樣在輸出的JWT就會以平面的方式輸出所有roles
          "my-roles": [
              "user",
              "READ_EMPLOYEE",
              "READ_PRODUCTS",
              "manage-account",
              "manage-account-links",
              "READ_DEPARTMENT",
              "offline_access",
              "user"
            ]

          • SPRING SECURITY中取出權限信息:

          @Bean
              public ReactiveJwtAuthenticationConverter jwtAuthenticationConverter(ObjectMapper objectMapper) {
                  
                  JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
                  jwtGrantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");
                  jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("my-roles");
                  
          //        KeycloakRealmRoleConverter keycloakRealmRoleConverter = new KeycloakRealmRoleConverter(objectMapper);
                  
                  ReactiveJwtGrantedAuthoritiesConverterAdapter reactiveJwtGrantedAuthoritiesConverterAdapter = 
                          new ReactiveJwtGrantedAuthoritiesConverterAdapter(
          //                        new KeycloakRealmRoleConverter(objectMapper);
                                  jwtGrantedAuthoritiesConverter
                              );
                  
                  ReactiveJwtAuthenticationConverter jwtConverter = new ReactiveJwtAuthenticationConverter();
                  jwtConverter.setJwtGrantedAuthoritiesConverter(reactiveJwtGrantedAuthoritiesConverterAdapter);
                  
                  return jwtConverter;
              }

          • 判斷是否有權限

          ServerHttpSecurity
                      .authorizeExchange(
                          a -> a.pathMatchers("/", "/error").permitAll()
                                .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                                .pathMatchers(HttpMethod.GET, "/protected/**").hasRole("READ_DEPARTMENT")
                                .anyExchange()
                                .authenticated()
                       )

          posted @ 2021-12-22 11:15 paulwong 閱讀(758) | 評論 (0)編輯 收藏

          WEBFLUX + SPRING SESSION + REACTIVE MONGODB

          添加依賴,pom.xml

          <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-webflux</artifactId>
          </dependency>
                  
                  
          <!-- spring session with mongodb -->
          <dependency>
             <groupId>org.springframework.session</groupId>
             <artifactId>spring-session-data-mongodb</artifactId>
          </dependency>
                  
          <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
          </dependency>

          配置文件,application.yaml

          spring:
             session:
                store-type: mongodb
                timeout: 30s
                mongodb:
                   collection-name: WEB_SESSIONS


          java配置,HttpSessionConfiguration.java:

          package com.paul.testmicroservicecommon.config;

          import org.springframework.boot.autoconfigure.session.MongoSessionProperties;
          import org.springframework.boot.autoconfigure.session.SessionProperties;
          import org.springframework.boot.context.properties.EnableConfigurationProperties;
          import org.springframework.context.annotation.Bean;
          import org.springframework.session.config.ReactiveSessionRepositoryCustomizer;
          import org.springframework.session.data.mongo.ReactiveMongoSessionRepository;
          import org.springframework.session.data.mongo.config.annotation.web.reactive.EnableMongoWebSession;

          @EnableMongoWebSession
          @EnableConfigurationProperties(MongoSessionProperties.class)
          public class HttpSessionConfiguration {
              
              @Bean
              public ReactiveSessionRepositoryCustomizer<ReactiveMongoSessionRepository> customize(
                  SessionProperties sessionProperties,
                  MongoSessionProperties mongoSessionProperties
              ){
                  return c -> {
                      c.setMaxInactiveIntervalInSeconds((int)sessionProperties.getTimeout().getSeconds());
                      c.setCollectionName(mongoSessionProperties.getCollectionName());
                  };
              }

          }

          posted @ 2021-12-22 09:24 paulwong 閱讀(293) | 評論 (0)編輯 收藏

          OAUTH2 - 4流程




          Authorization Code Grant




          Implicit Grant Flow




          Client Credential





          Password Grant flow





          https://itnext.io/an-oauth-2-0-introduction-for-beginners-6e386b19f7a9

          posted @ 2021-12-16 16:14 paulwong 閱讀(182) | 評論 (0)編輯 收藏

          SPRING CLOUD - REACTIVE FEIGN

          目前SPRING CLOUD(2020)尚未支持REACTIVE FEIGN,但官方推薦使用feign-reactive。

          pom.xml
          <dependency>
              <groupId>com.playtika.reactivefeign</groupId>
              <artifactId>feign-reactor-spring-cloud-starter</artifactId>
              <version>3.1.2</version>
              <type>pom</type>
          </dependency>


          LoanDecisionClientReactive.java
          package com.paul.testspringcloudstream.loancheck.service;

          import org.springframework.web.bind.annotation.PostMapping;
          import org.springframework.web.bind.annotation.RequestBody;

          import com.paul.testspringcloudstream.common.model.Loan;

          import reactivefeign.spring.config.ReactiveFeignClient;
          import reactor.core.publisher.Mono;

          @ReactiveFeignClient(name = "loan-decision")
          public interface LoanDecisionClientReactive {
              
              @PostMapping("/loan-decision")
              public Mono<Loan> getDecision(@RequestBody Loan loan);

          }

          LoanCheckConfiguration.java
          @Configuration
          @Import({
              MongoDbConsumerConfiguration.class,
          })
          @EnableDiscoveryClient
          @EnableReactiveFeignClients("com.paul.testspringcloudstream.loancheck.service")
          public class LoanCheckConfiguration {
          }


          使用同feign
          @Autowired
          private LoanDecisionClientReactive loanDecisionClientReactive;

          Reference
          https://blog.csdn.net/LCBUSHIHAHA/article/details/113817966

          官方SAMPLE
          https://github.com/kptfh/feign-reactive-sample

          posted @ 2021-12-01 16:45 paulwong 閱讀(589) | 評論 (0)編輯 收藏

          Spring bootstrap.yml 不管用,失效解決方案(spring cloud 2020.x.x)

          升級spring cloud版本之后發現bootstrap.yml 失效了,閱讀官方文檔得知,需要新增一個引用來開啟bootstrap.xml文件的讀取,新版spring cloud默認是關閉讀取了。
          增加依賴如下即可:
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-bootstrap</artifactId>
          </dependency>
          官方文檔:
          https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-first-bootstrap

          posted @ 2021-12-01 10:29 paulwong 閱讀(682) | 評論 (0)編輯 收藏

          SPRING REACTOR 之Flux和Mono

          SPRING REACTOR 之Flux和Mono,有點象SPRING INTEGRATION的IntegrationFlow,有如下特點
          • 定義了針對某種類型數據的處理流程
          • 可以進行類型轉換
          • 長期運行,除非被要求中止
          • 流程中的每種操作可以在新的線程中執行
          • 可以正常中止,如果中途有異常,則該流程也會中止
          • 要subscribe,流程才開始被啟動
          • 可以分割成各個子流程
          • 可以聚合子流程
          • Mono發送一個數據,就發送中止信號
          • Flux發送任意數據,由程序決定何時發送中止信號

          編程則比較簡單,先根據不同的數據類型定義不同的Flux或Mono,業務操作用Function包裝后,放在map/flatmap中,再調用subscribe啟動流程。

          posted @ 2021-11-23 14:30 paulwong 閱讀(615) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 Last 
          主站蜘蛛池模板: 台东市| 东阿县| 皋兰县| 呼和浩特市| 万山特区| 永修县| 嘉义市| 伊川县| 永丰县| 平潭县| 繁峙县| 嵊泗县| 澄迈县| 芷江| 乌兰察布市| 嘉义县| 隆化县| 万载县| 韶山市| 新宾| 蕉岭县| 黄梅县| 临泽县| 哈密市| 天津市| 元江| 桓台县| 兰州市| 建湖县| 柳河县| 康乐县| 额尔古纳市| 静宁县| 阜宁县| 莱西市| 神木县| 五大连池市| 湘乡市| 清新县| 边坝县| 交口县|