上次我們把驗證碼登錄柄瑰、小程序登錄優(yōu)雅地集成到了Spring Security,很多同學(xué)大呼過癮剪况,相比較一些傳統(tǒng)玩法高級了很多教沾。胖哥就趕緊抓住機會舉一反三,把幾個非標(biāo)準(zhǔn)的OAuth2也接入了進來译断,主要是微信授翻、企業(yè)微信,做到應(yīng)接盡接孙咪。
只需要通過下面幾行簡單的代碼就可以完成集成:
@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客戶端配置堪唐、預(yù)設(shè)的微信等知名三方配置,你還可以通過DelegateClientRegistrationRepository
的setDelegate
方法來擴展獲取客戶端配置的方式:
public void setDelegate(Function<String, ClientRegistration> delegate) {
this.delegate = delegate;
}
然后在HttpSecurity
中你這樣配置就完全OK了:
httpSecurity.apply(new OAuth2ProviderConfigurer(delegateClientRegistrationRepository))
// 微信網(wǎng)頁授權(quán) 下面的參數(shù)是假的
.wechatWebclient("wxdf90xxx8e7f", "bf1306baaaxxxxx15eb02d68df5")
// 企業(yè)微信登錄 下面的參數(shù)是假的
.workWechatWebLoginclient("wwa70dc5b6e56936e1",
"nvzGI4Alp3xxxxxxZUc3TtPtKbnfTEets5W8", "1000005")
// 微信掃碼登錄 下面的參數(shù)是假的
.wechatWebLoginclient("xxxxxxxx", "xxxxxxxx")
.oAuth2LoginConfigurerConsumer(oauth2Configurer->
oauth2Configurer.successHandler(new ForwardAuthenticationSuccessHandler("/"))
);
把帳號配置進去就完事了翎蹈,簡單不簡單淮菠,而且擴展性依然有保障,完全能夠滿足你的個性化需求荤堪。如果你想數(shù)據(jù)庫管理這些參數(shù)合陵,你可以自行擴展一下,也不難逞力。
登錄的效果成這樣:
稍微一改成自定義頁面曙寡,是不是高大上起來了呢糠爬?
登錄成功后的邏輯寇荧,你可以寫一個/
接口:
@GetMapping("/")
public Map<String, Object> index(@RegisteredOAuth2AuthorizedClient
OAuth2AuthorizedClient oAuth2AuthorizedClient) {
Authentication authentication = SecurityContextHolder.getContext()
.getAuthentication();
Map<String, Object> map = new HashMap<>(2);
// OAuth2AuthorizedClient 為敏感信息不應(yīng)該返回前端
map.put("oAuth2AuthorizedClient", oAuth2AuthorizedClient);
map.put("authentication", authentication);
// todo 處理登錄注冊的邏輯 處理權(quán)限問題
// todo 根據(jù) authentication 生成 token cookie之類的
// todo 也可以用 AuthenticationSuccessHandler 配置來替代
return map;
}
根據(jù)Authentication
信息返回token也好、cookie
也好执隧,都能實現(xiàn)揩抡。你也可以不寫接口,配置一個AuthenticationSuccessHandler
镀琉。
如果你有其它第三方OAuth2要對接峦嗤,可以提供給胖哥配置,胖哥幫你免費搞定屋摔。
項目和DEMO地址是:https://gitee.com/felord/spring-security-login-extension 記得給個star哦烁设!
關(guān)注公眾號:碼農(nóng)小胖哥,獲取更多資訊