国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring Security OAuth2 大揭秘

開發(fā) 架構(gòu)
OAuth2 是一個(gè)授權(quán)框架, 允許用戶授權(quán)第三方應(yīng)用訪問他們的資源(比如 GitHub 上的個(gè)人信息), 而無需直接提供密碼。

一、OAuth2是什么?為什么需要它?

OAuth2 是一個(gè)授權(quán)框架, 允許用戶授權(quán)第三方應(yīng)用訪問他們的資源(比如 GitHub 上的個(gè)人信息), 而無需直接提供密碼。

例如: 你想用 GitHub 賬號(hào)登錄某個(gè)網(wǎng)站, 這個(gè)網(wǎng)站會(huì)跳轉(zhuǎn)到 GitHub 讓你授權(quán), 授權(quán)成功后, 網(wǎng)站就能獲取你的 GitHub 基本信息(比如用戶名、頭像), 但不會(huì)拿到你的密碼. 

OAuth2核心角色: 

  1. 資源所有者(Resource Owner): 就是用戶本人
  2. 客戶端(Client): 我們的Spring Boot應(yīng)用
  3. 授權(quán)服務(wù)器(Authorization Server): 比如GitHub、Google的OAuth2服務(wù)
  4. 資源服務(wù)器(Resource Server): 存儲(chǔ)用戶數(shù)據(jù)的服務(wù)器

OAuth2的核心實(shí)現(xiàn)流程圖: 

圖片圖片

二、Spring Security OAuth2快速入門

1) 添加依賴

首先, 在你的 pom.xml 里加入 Spring Security OAuth2 的依賴:

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

2) 配置application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: your-github-client-id
            client-secret: your-github-client-secret
            scope: user:email,read:user

1. client-id 和 client-secret: 去 GitHub Developer Settings 申請(qǐng) OAuth App 獲取. 

2. scope: 定義你要獲取的用戶權(quán)限, 比如 user:email 可以獲取用戶的郵箱. 

3) 創(chuàng)建Security配置類

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login();  // 啟用 OAuth2 登錄
    }
}

現(xiàn)在, 訪問你的網(wǎng)站, 點(diǎn)擊登錄, 就會(huì)自動(dòng)跳轉(zhuǎn)到 GitHub 授權(quán)頁面了. 

三、自定義OAuth2用戶信息

默認(rèn)情況下, Spring Security 只會(huì)返回基本的用戶信息(如 nameemail). 但如果你想獲取更多信息(比如 GitHub 的 biolocation),就需要自定義 OAuth2UserService. 

@Service
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {


    private final OAuth2UserService<OAuth2UserRequest, OAuth2User> defaultService = new DefaultOAuth2UserService();


    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        // 1. 先讓默認(rèn)的 Service 加載用戶信息
        OAuth2User user = defaultService.loadUser(userRequest);


        // 2. 獲取額外的用戶信息(GitHub API)
        if ("github".equals(userRequest.getClientRegistration().getRegistrationId())) {
            String accessToken = userRequest.getAccessToken().getTokenValue();
            Map<String, Object> extraAttributes = fetchGitHubUserDetails(accessToken);
            user = new DefaultOAuth2User(user.getAuthorities(), extraAttributes, "login");  // "login" 是 GitHub 的主鍵字段
        }


        return user;
    }


    private Map<String, Object> fetchGitHubUserDetails(String accessToken) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(accessToken);
        HttpEntity<String> entity = new HttpEntity<>(headers);


        ResponseEntity<Map> response = restTemplate.exchange(
            "https://api.github.com/user",
            HttpMethod.GET,
            entity,
            Map.class
        );


        return response.getBody();
    }
}

更新Security配置: 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private CustomOAuth2UserService customOAuth2UserService;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login()
                .userInfoEndpoint()
                    .userService(customOAuth2UserService);  // 使用自定義的 UserService
    }
}

四、獲取登錄用戶信息

1) 通過SecurityContextHolder獲取:

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.core.user.OAuth2User;


@GetMapping("/user")
public String getUserInfo() {
    OAuth2User principal = (OAuth2User) SecurityContextHolder.getContext()
                            .getAuthentication()
                            .getPrincipal();


    return "User: " + principal.getAttributes();
}

2)  通過@AuthenticationPrincipal注解獲取: 

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;


@GetMapping("/user")
public String getUserInfo(@AuthenticationPrincipal OAuth2User principal) {
    // GitHub返回的屬性示例
    String name = principal.getAttribute("login"); // GitHub用戶名
    String email = principal.getAttribute("email"); 
    String avatar = principal.getAttribute("avatar_url");


    return "Hello, " + name + "! Email: " + email;
}


責(zé)任編輯:武曉燕 來源: 全棧程序員老馬
相關(guān)推薦

2022-02-15 07:35:12

服務(wù)器KeycloakOAuth2

2021-08-29 18:36:57

項(xiàng)目

2025-04-29 09:07:21

2022-04-11 07:34:46

OAuth2UAA節(jié)點(diǎn)

2021-11-15 13:58:00

服務(wù)器配置授權(quán)

2013-05-02 14:13:44

Android開發(fā)OAuth2服務(wù)認(rèn)證

2017-08-04 18:10:09

2023-08-31 08:34:07

Users對(duì)象序列化

2023-08-29 08:00:38

2025-04-01 05:00:00

OAuth2服務(wù)器身份驗(yàn)證

2021-08-02 12:50:45

sessiontokenJava

2025-01-13 08:04:24

2021-08-29 23:33:44

OAuth2服務(wù)器Keycloak

2022-06-29 08:37:11

授權(quán)碼模式底層

2025-05-12 03:02:00

SpringOAuth2客戶端

2022-06-20 08:37:28

接口tokenAO

2014-09-24 11:47:41

微信企業(yè)號(hào)開發(fā)

2022-11-16 14:02:44

2014-04-21 14:56:45

NodeJSOAuth2服務(wù)器

2020-11-12 09:55:02

OAuth2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人精品福利| 色综合久久天天| 搡女人真爽免费午夜网站| 国产欧美日本一区二区三区| a∨色狠狠一区二区三区| 久久久久久草| 欧美一区二区三区系列电影| 色狮一区二区三区四区视频| 色综合av综合无码综合网站| 欧美日韩福利电影| 久久女同互慰一区二区三区| 国产日本久久| 国产精品国模在线| 午夜激情一区二区三区| 四季av一区二区三区免费观看| 日韩av综合在线观看| 九色成人免费视频| 99久久er热在这里只有精品15| 搞黄网站在线看| 岛国一区二区三区高清视频| 日韩一区二区不卡| 青青草国产精品亚洲专区无| 欧美猛烈性xbxbxbxb| 欧美日本韩国国产| 欧美日本一区二区在线观看| 国产综合视频| 色www永久免费视频首页在线| 欧美一级中文字幕| 欧美大片在线看免费观看| 亚洲另类在线一区| 亚洲深深色噜噜狠狠爱网站| 18视频在线观看| 欧美精品99久久| 热久久这里只有精品| 欧美日韩中文在线| 亚洲三级视频| 二区三区不卡| 欧美日韩亚洲一| 美女撒尿一区二区三区| 亚洲国产日日夜夜| 久久综合伊人| 九九色在线视频| av在线观看地址| 精品中文字幕乱| 亚洲综合一二区| 香蕉成人久久| 91精品美女| 一级毛片在线观| 只有这里有精品| 综合国产在线视频| 中文字幕中文字幕在线一区 | 亚洲国产一区二区三区青草影视 | 国产成人免费在线观看| 要久久电视剧全集免费| 偷偷要 色偷偷| 亚洲巨乳在线观看| 97国产精品免费视频| 欧美日韩国产色站一区二区三区| 免费成人av资源网| 亚洲免费成人av在线| www.久久ai| 国产精品视频中文字幕| 欧美不卡三区| 4438全国成人免费| 日韩欧美aaaaaa| 亚洲欧美日韩国产成人精品影院| 日本麻豆一区二区三区视频| 西瓜成人精品人成网站| 欧美1—12sexvideos| 男女午夜刺激视频| 日韩三级电影| 久久久久久久色| 在线免费观看日韩欧美| 国产成人免费视频| 午夜精品毛片| 久久久久久爱| 中国av在线播放| 人人干人人干人人| 婷婷五月色综合| 日本一区二区三区四区视频| 日韩av在线精品| 亚洲韩国精品一区| a美女胸又www黄视频久久| 精品二区久久| 极品国产人妖chinesets亚洲人妖| 免费在线午夜视频| 国产字幕中文| 91传媒久久久| 亚洲永久激情精品| 国产精品传媒毛片三区| 17婷婷久久www| 久久精品视频99| 欧美精品一区二区久久久| 亚洲国产日韩精品| 久久影视一区二区| 日韩精品欧美成人高清一区二区| 经典一区二区| 欧洲精品99毛片免费高清观看 | 欧美午夜精品一区二区三区电影| 免费污视频在线一区| 欧洲综合视频| 亚洲欧美国产中文| 大片在线观看网站免费收看| 快播日韩欧美| 国产精品黄色av| 欧美国产第一页| 日韩精品视频观看| 在线不卡免费欧美| 欧美这里有精品| 福利精品视频在线| 亚洲国产另类精品专区| 国产精品美女久久久久久| 94色蜜桃网一区二区三区| 视频一区视频二区中文字幕| 精品精品久久| 国产成人精品一区二区免费看京 | 沈樵精品国产成av片| 成人搞黄视频| 亚洲高清影院| 激情开心成人网| 国产盗摄一区二区| 国产精品一卡二卡三卡| 你懂的免费在线观看视频网站| 久草在线资源视频| 蜜桃臀av在线| 中文字幕大看焦在线看| 国产对白在线正在播放| 国内福利写真片视频在线| 女生裸体视频网站免费观看| 亚洲欧洲日本精品| 99re99热| 看全色黄大色大片| 日韩视频在线播放| 欧美极品色图| 日本午夜精品电影| 日韩影片在线播放| 亚洲一区三区| 综合操久久久| 一级二级三级欧美| 久久精品在线免费视频| 国产一二三区在线播放| 国产精品12345| 欧美视频第一区| 欧美黑人经典片免费观看| www一区二区www免费| 日韩av黄色网址| 亚色视频在线观看| 天堂在线看视频| 亚洲大胆精品| 在线观看免费版| 免费av网站在线观看| 成人影音在线| 欧美aa视频| 国产午夜亚洲精品一级在线| 国产精品美女午夜爽爽| 欧美一级免费| 国产成人精选| 日本成人三级电影| 香蕉成人在线| 荡女精品导航| 九一精品国产| 欧美精品不卡| 国产综合色产| 蜜桃91丨九色丨蝌蚪91桃色| 国产高清久久久| 91蝌蚪porny成人天涯| 国产精品久久免费看| 亚洲成人av免费| 在线播放一区二区三区| 日韩你懂的在线播放| 日韩电影视频免费| 亚洲天天在线日亚洲洲精| 久久久国产成人精品| 26uuu另类亚洲欧美日本老年| 国产精品扒开腿做爽爽爽的视频| 成人精品一区二区三区电影免费| 国产女精品视频网站免费| 久久草.com| 欧美日韩一级在线| 一二三四中文字幕| 天堂色在线视频| 国产福利小视频在线| 日韩三级影院| 国产精品蜜芽在线观看| 超碰成人福利| 91成人免费| 日韩精品一区第一页| 成人精品一区二区三区中文字幕| 国产精品第四页| 亚洲欧美aⅴ...| 制服丝袜av成人在线看| 色偷偷av亚洲男人的天堂| 国产精品v片在线观看不卡| 精品伦精品一区二区三区视频 | 国产精品天天摸av网| 日本高清成人免费播放| 精品视频www| 国产精品免费在线免费| 久久久久久久有限公司| 男人亚洲天堂网|