<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      轉-OAuth2.0 原理流程及其單點登錄和權限控制

      原文鏈接

      單點登錄是多域名企業站點流行的登錄方式。本文以現實生活場景輔助理解,力爭徹底理清 OAuth2.0 實現單點登錄的原理流程。同時總結了權限控制的實現方案,及其在微服務架構中的應用。

      1 什么是單點登錄

      1.1 多點登錄

      傳統的多點登錄系統中,每個站點都實現了本站專用的帳號數據庫和登錄模塊。各站點的登錄狀態相互不認可,各站點需要逐一手工登錄。如下圖,有兩個術語含義如下:

      • 認證(authentication): 驗證用戶的身份;
      • 授權(authorization): 驗證用戶的訪問權限。

      1706260087945.png

      1.2 單點登錄

      單點登錄,英文是 Single Sign On,縮寫為 SSO。

      多個站點(192.168.1.20X)共用一臺認證授權服務器(192.168.1.110,用戶數據庫和認證授權模塊共用)。用戶經由其中任何一個站點(比如 192.168.1.201)登錄后,可以免登錄訪問其他所有站點。而且,各站點間可以通過該登錄狀態直接交互。

      1706260115462.png

      2 OAuth2 認證授權的原理流程

      2.1 生活實例【★★重點★★】

      為了直觀的理解 OAuth2.0 原理流程,我們假設這樣一個生活場景:

      (1)檔案局A(客戶端 / Client):以“檔案局ID/密碼”標識,是掌握檔案資源的機構。并列還有很多檔案局B/C/…,每個檔案局存儲的檔案內容(資源 / Resource)不一樣,比如政治、經濟、軍事、文化等;

      (2)公民張三(資源所有者 / Resource Owner):以“用戶名/密碼”標識,需要到各個檔案局查檔案;

      (3)派出所(授權服務器 / Authentication Server):可以是單個巨大的派出所,也可以是數據共享的派出所集群,掌管的信息、提供的對外接口功能有:

      • 檔案局信息:所有檔案局的“檔案局ID/密碼”,證明檔案局的身份;
      • 公民信息:所有公民的“用戶名/密碼”,能提供張三是張三的用戶身份證明(認證 / Authentication)
      • 公民對于檔案局的權限:有張公民和檔案局的權限的映射表,可查得各公民對各檔案局是否有操作權限(授權 / Authorization)。通常,設計中會增加官職(角色 / Role)一層,各公民屬于哪個官職(角色),哪個官職(角色)對于特定檔案局有操作權限。

      2.1.1 張三首次訪問檔案局A

      張三之前從未到訪檔案局,第一次來檔案局。對照下圖序號理解:

      (1)張三來到“檔案局A”的“檔案處”,該處要求實名登記后才能查詢,被指示到“用戶登記處”辦理(HTTP重定向);

      (2)張三來到“檔案局A”的“用戶登記處”,既不能證明身份(認證),又不能證明自己有查檔案A的權限(授權)。張三攜帶檔案局A的標識(client-id),被重定向至“授權信開具處”;

      (3)張三來到“派出所”的“授權信開具處”,出示檔案局A的標識,希望開具授權信(授權)。該處要求首先證明身份(認證),被重定向至“用戶身份驗證處”;

      (4)張三來到“派出所”的“用戶身份驗證處”,領取了用戶身份表(網頁登錄表單 Form);

      (5)張三填上自己的用戶名和密碼,交給(提交 / Submit)“用戶身份驗證處”,該處從私用數據庫中查得用戶名密碼匹配,確定此人是張三,開具身份證明信,完成認證。張三帶上身份證明信和檔案局A的標識,被重定向至“授權信開具處”;

      (6)張三再次來到“授權信開具處”,出示身份證明信和檔案局A的標識,該處從私用數據庫中查得,張三的官職是市長級別(角色),該官職具有檔案局A的查詢權限,就開具“允許張三查詢檔案局A”的授權信(授權碼 / code),張三帶上授權信被重定向至“檔案局”的“用戶登錄處”;

      (7)張三到了“檔案局”的“用戶登錄處”,該處私下拿出檔案局A的標識(client-id)和密碼,再附上張三出示的授權信(code),向“派出所”的“腰牌發放處”為張三申請的“腰牌”(token),將來張三可以帶著這個腰牌表明身份和權限。又被重定向到“檔案處”;

      (8)張三的會話(Session)已經關聯上了腰牌(token),可以直接通過“檔案處”查檔案。

      1706260138545.png

      2.1.2 張三首次訪問檔案局B

      張三已經成功訪問了檔案局A,現在他要訪問檔案局B。對照下圖序號理解:

      (1)/(2) 同上;

      (3)張三已經有“身份證明信”,直接在“派出所”的“授權信開具處”成功開具“訪問檔案局B”的授權信;

      (4)/(5)/(6) 免了;

      (7)“檔案局B”的“用戶登記處”完成登記;

      (8)“檔案局B”的“檔案處”查得檔案。

      1706260155880.png

      2.1.3 張三再次訪問檔案局A

      張三已經成功訪問了檔案局A,現在他要訪問檔案局A。對照下圖序號理解:

      (1)直接成功查到了檔案;

      (2~8)都免了。

      1706260177919.png

      2.2 HTTP 重定向原理

      HTTP 協議中,瀏覽器的 REQUEST 發給服務器之后,服務器如果發現該業務不屬于自己管轄,會把你支派到自身服務器或其他服務器(host)的某個接口(uri)。正如我們去政府部門辦事,每到一個窗口,工作人員會說“你帶上材料A,到本所的X窗口,或者其他Y所的Z窗口”進行下一個手續。

      1706260200813.png

      2.3 SSO 工作流程

      至此,就不難理解 OAuth 2.0 的認證/授權流程,此處不再贅述。請拿下圖對照“2.1 生活實例”一節來理解。

      1706260216697.png

      2.4 OAuth2.0 進階

      根據官方標準,OAuth 2.0 共用四種授權模式:

      • Authorization Code: 用在服務端應用之間,這種最復雜,也是本文采用的模式;
      • Implicit: 用在移動app或者web app(這些app是在用戶的設備上的,如在手機上調起微信來進行認證授權)
      • Resource Owner Password Credentials(password): 應用直接都是受信任的(都是由一家公司開發的,本例子使用)
      • Client Credentials: 用在應用API訪問。

      1706260240129.png

      3 基于 SpringBoot 實現認證/授權

      官方文檔:Spring Cloud Security

      3.1 授權服務器(Authorization Server)

      (1) pom.xml

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-oauth2</artifactId>
      </dependency>
      

      (2) application.properties

      server.port=8110 ## 監聽端口
      

      (3) AuthorizationServerApplication.java

      @EnableResourceServer 
      // 啟用資源服務器
      public class AuthorizationServerApplication 
      {    
      	// ...
      }
      

      (4) 配置授權服務的參數

      @Configuration  
      @EnableAuthorizationServer  
      public class Oauth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {  
          @Override  
          public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {  
              clients.inMemory()  
                      .withClient("webapp").secret("secret") //客戶端 id/secret  
                      .authorizedGrantTypes("authorization code") //授權媽模式  
                      .scopes("user_info")  
                      .autoApprove(true) //自動審批  
                      .accessTokenValiditySeconds(3600); //有效期1hour  
          }  
      }  
        
      @Configuration  
      public class Oauth2WebSecurityConfigurer extends WebSecurityConfigurerAdapter {  
          @Override  
          protected void configure(HttpSecurity http) throws Exception {  
              http.requestMatchers()  
                      .antMatchers("/login", "/oauth/authorize/oauth/logout")  
                      .and().authorizeRequests().anyRequest().authenticated()  
                      .and().formLogin().permitAll();  
          }  
        
          @Override  
          protected void configure(AuthenticationManagerBuilder auth) throws Exception {  
              auth.inMemoryAuthentication().withUser("admin").password("admin123").roles("ADMIN");  
          }  
      }
      

      3.2 客戶端(Client, 業務網站)

      (1) pom.xml

      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-oauth2</artifactId>
      </dependency>
      

      (2) application.properties

      server port=8080  
      security.oauth2.client.client-id=webapp  
      security.oauth2.client.client-secret=secret  
      security.oauth2.client.access-token-uri=http://localhost:8110/oauth/token  
      security.oauth2.client.user-authorization-uri=http://localhost:8110/oauth/authorize  
      security.oauth2.resource.user-info-uri=http://localhost:8110/oauth/user
      

      (3) 配置 WEB 安全

      @Configuration  
      @EnableOAuth2Sso  
      public class Oauth2WebsecurityConfigurer extends WebSecurityConfigurerAdapter {  
          @Override  
          public void configure(HttpSecurity http) throws Exception {  
              http.antMatcher("/**").authorizeRequests()  
                      .antMatchers("/", "/login").permitAll()  
                      .anyRequest().authenticated();  
          }  
      }  
        
      @RestController  
      public class Oauth2ClientController {  
          @GetMapping("/")  
          public ModelAndView index() {  
              return new ModelAndView("index");  
          }  
        
          @GetMapping("/welcome")  
          public ModelAndView welcome() {  
              return new ModelAndView("welcome");  
          }  
      }
      

      3.3 用戶權限控制(基于角色)

      • 授權服務器中,定義各用戶擁有的角色: user=USER, admin=ADMIN/USER, root=ROOT/ADMIN/USER
      • 業務網站中(client),注解標明哪些角色可
      @RestController  
      public class Oauth2ClientController {  
          @GetMapping("/welcome")  
          public ModelAndView welcome() {  
              return new ModelAndView("welcome");  
          }  
        
          @GetMapping("/api/user")  
          @PreAuthorize("hasAuthority('USER')")  
          public Map<String, Object> apiUser() {  
          }  
        
          @GetMapping("/api/admin")  
          @PreAuthorize("hasAuthority('ADMIN')")  
          public Map<String, Object> apiAdmin() {  
          }  
        
          @GetMapping("/api/root")  
          @PreAuthorize("hasAuthority('ROOT')")  
          public Map<String, Object> apiRoot() {  
          }  
      }
      

      4 綜合運用

      4.1 權限控制方案

      下圖是基本的認證/授權控制方案,主要設計了認證授權服務器上相關數據表的基本定義。可對照本文“2.1 生活實例”一節來理解。

      1706261125133.png

      4.2 在微服務架構中的應用

      與常規服務架構不同,在微服務架構中,Authorization Server/Resource Server 是作為微服務存在的,用戶的登錄可以通過API網關一次性完成,無需與無法跳轉至內網的 Authorization Server 來完成。

      1706261141918.png

      posted @ 2024-07-09 17:57  booleandev  閱讀(31)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产原创自拍三级在线观看| 沂水县| 国产漂亮白嫩美女在线观看| 色婷婷av久久久久久久| 亚洲一二三四区中文字幕| 亚洲成人av在线系列| 福利视频一区二区在线| 亚洲欧美人成人让影院| 在线播放国产精品亚洲| 久久久久中文伊人久久久| 国产一区二区日韩在线| 国产一区二区亚洲精品| 亚洲老熟女一区二区三区 | 东京热高清无码精品| 蜜臀av入口一区二区三区| 精品国产美女福到在线不卡| 欧美交a欧美精品喷水| 亚洲欧洲精品成人久久曰| 亚洲男人av香蕉爽爽爽爽| 激情综合网激情五月伊人| 极品尤物被啪到呻吟喷水| 安福县| 实拍女处破www免费看| 性欧美VIDEOFREE高清大喷水| 葫芦岛市| av天堂久久天堂av| 日韩卡1卡2卡三卡免费网站| 精品人妻少妇一区二区三区| 强插少妇视频一区二区三区| 欧美成人精品手机在线| 久久国产精品99久久蜜臀| 无码成人午夜在线观看| 重口SM一区二区三区视频| 国产成人高清亚洲综合| 国产亚洲制服免视频| 亚洲精品福利一区二区三区蜜桃| 四虎精品永久在线视频| 美女扒开尿口让男人桶| av亚洲在线一区二区| 日韩精品无码一区二区视频| 人妻中文字幕不卡精品|