上次我們把驗證碼登入、小程式登入優雅地整合到了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客戶端配置、預設的微信等知名三方配置,你還可以通過DelegateClientRegistrationRepository
的setDelegate
方法來擴充套件獲取客戶端配置的方式:
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("/"))
);
把帳號配置進去就完事了,簡單不簡單,而且擴充套件性依然有保障,完全能夠滿足你的個性化需求。如果你想資料庫管理這些引數,你可以自行擴充套件一下,也不難。
登入的效果成這樣:
稍微一改成自定義頁面,是不是高大上起來了呢?
登入成功後的邏輯,你可以寫一個/
介面:
@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/spri... 記得給個star哦!
關注公眾號:Felordcn 獲取更多資訊