這個Spring Security登入外掛牛啊,驗證碼、小程式、OAuth2都能快速接入

碼農小胖哥 發表於 2022-06-15
Spring

上次我們把驗證碼登入、小程式登入優雅地整合到了Spring Security,很多同學大呼過癮,相比較一些傳統玩法高階了很多。胖哥就趕緊抓住機會舉一反三,把幾個非標準的OAuth2也接入了進來,主要是微信、企業微信,做到應接盡接。

只需要通過下面幾行簡單的程式碼就可以完成整合:

    @Bean
    DelegateClientRegistrationRepository delegateClientRegistrationRepository(@Autowired(required = false) OAuth2ClientProperties properties) {
        DelegateClientRegistrationRepository clientRegistrationRepository = new DelegateClientRegistrationRepository();
        if (properties != null) {
            List<ClientRegistration> registrations = new ArrayList<>(
                    OAuth2ClientPropertiesRegistrationAdapter.getClientRegistrations(properties).values());
            registrations.forEach(clientRegistrationRepository::addClientRegistration);
        }
        return clientRegistrationRepository;
    }

這個是為了相容在application.yaml配置檔案的OAuth2客戶端配置、預設的微信等知名三方配置,你還可以通過DelegateClientRegistrationRepositorysetDelegate方法來擴充套件獲取客戶端配置的方式:

    public void setDelegate(Function<String, ClientRegistration> delegate) {
        this.delegate = delegate;
    }

然後在HttpSecurity中你這樣配置就完全OK了:

httpSecurity.apply(new OAuth2ProviderConfigurer(delegateClientRegistrationRepository))
                // 微信網頁授權  下面的引數是假的
            .wechatWebclient("wxdf90xxx8e7f", "bf1306baaaxxxxx15eb02d68df5")
                // 企業微信登入 下面的引數是假的
            .workWechatWebLoginclient("wwa70dc5b6e56936e1",
                                      "nvzGI4Alp3xxxxxxZUc3TtPtKbnfTEets5W8", "1000005")
                // 微信掃碼登入 下面的引數是假的
            .wechatWebLoginclient("xxxxxxxx", "xxxxxxxx")
         .oAuth2LoginConfigurerConsumer(oauth2Configurer-> 
           oauth2Configurer.successHandler(new ForwardAuthenticationSuccessHandler("/"))
          );

把帳號配置進去就完事了,簡單不簡單,而且擴充套件性依然有保障,完全能夠滿足你的個性化需求。如果你想資料庫管理這些引數,你可以自行擴充套件一下,也不難。

登入的效果成這樣:

這個Spring Security登入外掛牛啊,驗證碼、小程式、OAuth2都能快速接入

稍微一改成自定義頁面,是不是高大上起來了呢?

這個Spring Security登入外掛牛啊,驗證碼、小程式、OAuth2都能快速接入

登入成功後的邏輯,你可以寫一個/介面:

    @GetMapping("/")
    public Map<String, Object> index(@RegisteredOAuth2AuthorizedClient
                                     OAuth2AuthorizedClient oAuth2AuthorizedClient) {
        Authentication authentication = SecurityContextHolder.getContext()
            .getAuthentication();
        Map<String, Object> map = new HashMap<>(2);

        // OAuth2AuthorizedClient 為敏感資訊不應該返回前端
        map.put("oAuth2AuthorizedClient", oAuth2AuthorizedClient);
        map.put("authentication", authentication);
        // todo 處理登入註冊的邏輯 處理許可權問題
        // todo 根據 authentication 生成  token   cookie之類的   
        // todo 也可以用 AuthenticationSuccessHandler 配置來替代
        return map;
    }

根據Authentication資訊返回token也好、cookie也好,都能實現。你也可以不寫介面,配置一個AuthenticationSuccessHandler

如果你有其它第三方OAuth2要對接,可以提供給胖哥配置,胖哥幫你免費搞定。

專案和DEMO地址是:https://gitee.com/felord/spring-security-login-extension 記得給個star哦!

關注公眾號:Felordcn 獲取更多資訊

個人部落格:https://felord.cn