




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第java構(gòu)建OAuth2授權(quán)服務(wù)器目錄構(gòu)建OAuth2授權(quán)服務(wù)器
設(shè)置客戶端和用戶認(rèn)證信息
設(shè)置客戶端信息
設(shè)置用戶認(rèn)證信息
生成Token
構(gòu)建OAuth2授權(quán)服務(wù)器
從表現(xiàn)形式上看,OAuth2授權(quán)服務(wù)器也是一個(gè)獨(dú)立的微服務(wù),因此構(gòu)建授權(quán)服務(wù)器的方法也是創(chuàng)建一個(gè)SpringBoot應(yīng)用程序,我們需要引入對(duì)應(yīng)的Maven依賴,如下所示:
dependency
groupIdorg.springframework.security.oauth/groupId
artifactIdspring-security-oauth2/artifactId
/dependency
這里的spring-security-oauth2就是來(lái)自SpringSecurity中的OAuth2庫(kù)?,F(xiàn)在Maven依賴已經(jīng)添加完畢,下一步就是構(gòu)建Bootstrap類作為訪問(wèn)的入口:
@SpringBootApplication
@EnableAuthorizationServer
publicclassAuthServer{
publicstaticvoidmain(String[]args){
SpringApplication.run(AuthServer.class,args);
請(qǐng)注意,這里出現(xiàn)了一個(gè)新的注解@EnableAuthorizationServer,這個(gè)注解的作用在于為微服務(wù)運(yùn)行環(huán)境提供一個(gè)基于OAuth2協(xié)議的授權(quán)服務(wù),該授權(quán)服務(wù)會(huì)暴露一系列基于RESTful風(fēng)格的端點(diǎn)(例如/oauth/authorize和/oauth/token)供OAuth2授權(quán)流程使用。
構(gòu)建OAuth2授權(quán)服務(wù)只是集成OAuth2協(xié)議的第一步,授權(quán)服務(wù)器是一種集中式系統(tǒng),管理著所有與安全性流程相關(guān)的客戶端和用戶信息。因此,接下來(lái)我們需要在授權(quán)服務(wù)器中對(duì)這些基礎(chǔ)信息進(jìn)行初始化,而SpringSecurity為我們提供了各種配置類來(lái)實(shí)現(xiàn)這一目標(biāo)。
設(shè)置客戶端和用戶認(rèn)證信息
OAuth2.0有幾個(gè)授權(quán)模式:授權(quán)碼模式、簡(jiǎn)化模式、密碼模式、客戶端憑證模式。其中,密碼模式以其簡(jiǎn)單性得到了廣泛的應(yīng)用。在接下來(lái)的內(nèi)容中,我們就以密碼模式為例展開講解。
在密碼模式下,用戶向客戶端提供用戶名和密碼,并將用戶名和密碼發(fā)給授權(quán)服務(wù)器從而請(qǐng)求Token。授權(quán)服務(wù)器首先會(huì)對(duì)密碼憑證信息進(jìn)行認(rèn)證,確認(rèn)無(wú)誤后,向客戶端發(fā)放Token。整個(gè)流程如下圖所示:
請(qǐng)注意,授權(quán)服務(wù)器在這里執(zhí)行認(rèn)證操作的目的是驗(yàn)證傳入的用戶名和密碼是否正確。在密碼模式下,這一步是必需的,如果采用其他授權(quán)模式,不一定會(huì)有用戶認(rèn)證這一環(huán)節(jié)。
確定采用密碼模式后,我們來(lái)看為了實(shí)現(xiàn)這一授權(quán)模式,需要對(duì)授權(quán)服務(wù)器做哪些開發(fā)工作。首先我們需要設(shè)置一些基礎(chǔ)數(shù)據(jù),包括客戶端信息和用戶信息。
設(shè)置客戶端信息
我們先來(lái)看如何設(shè)置客戶端信息。設(shè)置客戶端時(shí),用到的配置類是ClientDetailsServiceConfigurer,該配置類用來(lái)配置客戶端詳情服務(wù)ClientDetailsService。用于描述客戶端詳情的ClientDetails接口則包含了與安全性控制相關(guān)的多個(gè)重要方法,該接口中的部分方法定義如下:
publicinterfaceClientDetailsextendsSerializable{
//客戶端唯一性Id
StringgetClientId();
//客戶端安全碼
StringgetClientSecret();
//客戶端的訪問(wèn)范圍
SetStringgetScope();
//客戶端可以使用的授權(quán)模式
SetStringgetAuthorizedGrantTypes();
首先ClientId是一個(gè)必備屬性,用來(lái)唯一標(biāo)識(shí)客戶的Id,而ClientSecret代表客戶端安全碼。這里的Scope用來(lái)限制客戶端的訪問(wèn)范圍,如果這個(gè)屬性為空,客戶端就擁有全部的訪問(wèn)范圍。常見的設(shè)置方式可以是webclient或mobileclient,分別代表Web端和移動(dòng)端。
最后,authorizedGrantTypes代表客戶端可以使用的授權(quán)模式,可選的范圍包括代表授權(quán)碼模式的authorization_code、代表隱式授權(quán)模式implicit、代表密碼模式的password以及代表客戶端憑據(jù)模式的client_credentials。這個(gè)屬性在設(shè)置上也可以添加refresh_token,通過(guò)刷新操作獲取以上授權(quán)模式下產(chǎn)生的新Token。
和實(shí)現(xiàn)認(rèn)證過(guò)程類似,SpringSecurity也提供了AuthorizationServerConfigurerAdapter這個(gè)配置適配器類來(lái)簡(jiǎn)化配置類的使用方式。我們可以通過(guò)繼承該類并覆寫其中的configure(ClientDetailsServiceConfigurerclients)方法進(jìn)行配置。使用AuthorizationServerConfigurerAdapter進(jìn)行客戶端信息配置的基本代碼結(jié)構(gòu)如下:
@Configuration
publicclassSpringAuthorizationServerConfigurerextendsAuthorizationServerConfigurerAdapter{
@Override
publicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{
clients.inMemory()
.withClient("spring")
.secret("{noop}spring_secret")
.authorizedGrantTypes("refresh_token","password","client_credentials")
.scopes("webclient","mobileclient");
可以看到,我們創(chuàng)建了一個(gè)SpringAuthorizationServerConfigurer類來(lái)繼承AuthorizationServerConfigurerAdapter,并通過(guò)ClientDetailsServiceConfigurer配置類設(shè)置了授權(quán)模式為密碼模式。在授權(quán)服務(wù)器中存儲(chǔ)客戶端信息有兩種方式,一種就是如上述代碼所示的基于內(nèi)存級(jí)別的存儲(chǔ),另一種則是通過(guò)JDBC在數(shù)據(jù)庫(kù)中存儲(chǔ)詳情信息。為了簡(jiǎn)單起見,這里使用了內(nèi)存級(jí)別的存儲(chǔ)方式。
同時(shí)我們注意到,在設(shè)置客戶端安全碼時(shí)使用了"{noop}spring_secret"這種格式。這是因?yàn)樵赟pringSecurity5中統(tǒng)一使用PasswordEncoder對(duì)密碼進(jìn)行編碼,在設(shè)置密碼時(shí)要求格式為“{id}password”。而這里的前綴“{noop}”就是代表具體PasswordEncoder的id,表示我們使用的是NoOpPasswordEncoder。
@EnableAuthorizationServer注解會(huì)暴露一系列的端點(diǎn),而授權(quán)過(guò)程是使用AuthorizationEndpoint這個(gè)端點(diǎn)進(jìn)行控制的。要想對(duì)該端點(diǎn)的行為進(jìn)行配置,你可以使用AuthorizationServerEndpointsConfigurer這個(gè)配置類。和ClientDetailsServiceConfigurer配置類一樣,我們也通過(guò)使用AuthorizationServerConfigurerAdapter配置適配器類進(jìn)行配置。
因?yàn)槲覀冎付耸跈?quán)模式為密碼模式,而密碼模式包含認(rèn)證環(huán)節(jié)。所以針對(duì)AuthorizationServerEndpointsConfigurer配置類需要指定一個(gè)認(rèn)證管理器AuthenticationManager,用于對(duì)用戶名和密碼進(jìn)行認(rèn)證。同樣因?yàn)槲覀冎付嘶诿艽a的授權(quán)模式,所以需要指定一個(gè)自定義的UserDetailsService來(lái)替換全局的實(shí)現(xiàn),可以通過(guò)如下代碼來(lái)配置AuthorizationServerEndpointsConfigurer:
@Configuration
publicclassSpringAuthorizationServerConfigurerextendsAuthorizationServerConfigurerAdapter{
@Autowired
privateAuthenticationManagerauthenticationManager;
@Autowired
privateUserDetailsServiceuserDetailsService;
@Override
publicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{endpoints.authenticationManager(authenticationManager).userDetailsService(userDetailsService);
至此,客戶端設(shè)置工作全部完成,我們所做的事情就是實(shí)現(xiàn)了一個(gè)自定義的SpringAuthorizationServerConfigurer配置類并覆寫了對(duì)應(yīng)的配置方法。
設(shè)置用戶認(rèn)證信息
設(shè)置用戶認(rèn)證信息所依賴的配置類是WebSecurityConfigurer類,SpringSecurity同樣提供了WebSecurityConfigurerAdapter類來(lái)簡(jiǎn)化該配置類的使用方式,我們可以繼承WebSecurityConfigurerAdapter類并且覆寫其中的configure()的方法來(lái)完成配置工作。
關(guān)于WebSecurityConfigurer配置類,我們首先需要明確配置的內(nèi)容。實(shí)際上,設(shè)置用戶信息非常簡(jiǎn)單,只需要指定用戶名(User)、密碼(Password)和角色(Role)這三項(xiàng)數(shù)據(jù)即可,如下所示:
@Configuration
publicclassSpringWebSecurityConfigurerextendsWebSecurityConfigurerAdapter{
@Override
@Bean
publicAuthenticationManagerauthenticationManagerBean()throwsException{
returnsuper.authenticationManagerBean();
@Override
@Bean
publicUserDetailsServiceuserDetailsServiceBean()throwsException{
returnsuper.userDetailsServiceBean();
@Override
protectedvoidconfigure(AuthenticationManagerBuilderbuilder)throwsException{
builder
.inMemoryAuthentication()
.withUser("user1")
.password("{noop}password1")
.roles("USER")
.and()
.withUser("admin")
.password("{noop}password2")
.roles("USER","ADMIN");
結(jié)合上面的代碼,我們看到構(gòu)建了具有不同角色和密碼的兩個(gè)用戶,請(qǐng)注意"user1"代表的角色是一個(gè)普通用戶,"admin"則具有管理員角色。我們?cè)谠O(shè)置密碼時(shí),同樣需要添加前綴“{noop}”。同時(shí),我們還看到authenticationManagerBean()和userDetailsServiceBean()方法分別返回了父類的默認(rèn)實(shí)現(xiàn),而這里返回的UserDetailsService和AuthenticationManager在前面設(shè)置客戶端時(shí)會(huì)用到。
生成Token
現(xiàn)在,OAuth2授權(quán)服務(wù)器已經(jīng)構(gòu)建完畢,啟動(dòng)這個(gè)授權(quán)服務(wù)器,我們就可以獲取Token。我們?cè)跇?gòu)建OAuth2服務(wù)器時(shí)已經(jīng)提到授權(quán)服務(wù)器中會(huì)暴露一批端點(diǎn)供HTTP請(qǐng)求進(jìn)行訪問(wèn),而獲取Token的端點(diǎn)就是http://localhost:2000/oauth/token。在使用該端點(diǎn)時(shí),我們需要提供前面配置的客戶端信息和用戶信息。
這里使用Postman來(lái)模擬HTTP請(qǐng)求,客戶端信息設(shè)置方式如下圖所示:
我們?cè)凇?/p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司提成策劃方案(3篇)
- 推門聽課活動(dòng)方案(3篇)
- 醫(yī)院食堂人群管理制度
- 室內(nèi)小房改造方案(3篇)
- 停水設(shè)備檢修方案(3篇)
- 醫(yī)院設(shè)備故障管理制度
- 建安企業(yè)倉(cāng)儲(chǔ)管理制度
- 關(guān)于餐廳衛(wèi)生管理制度
- 物業(yè)地面改造方案(3篇)
- 危險(xiǎn)崗位應(yīng)急管理制度
- 2023年山東省青島市市南區(qū)、市北區(qū)、嶗山區(qū)中考數(shù)學(xué)一模試卷(含答案解析)
- 單板硬件調(diào)試與單元測(cè)試方案報(bào)告
- 村內(nèi)魚塘改造申請(qǐng)書
- DB23T 2327-2019 透水混凝土鉸接塊護(hù)坡應(yīng)用技術(shù)規(guī)范
- 醫(yī)院護(hù)理培訓(xùn)課件:《母嬰同室病房醫(yī)院感染預(yù)防與控制》
- 網(wǎng)絡(luò)微短劇的內(nèi)容創(chuàng)新策略研究
- Zemax軟件設(shè)計(jì)教程PPT
- 【深信服】安全PT1-EDR認(rèn)證考試必備復(fù)習(xí)題庫(kù)(含答案)
- 簡(jiǎn)愛英文讀書報(bào)告-(精華版)課件
- 三瓶胸腔閉式引流負(fù)壓吸引護(hù)理常規(guī)
- 某村古建筑保護(hù)建設(shè)工程項(xiàng)目可行性方案
評(píng)論
0/150
提交評(píng)論