一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Spring Cloud入門-Oauth2授權(quán)之基于JWT完成單點登錄(Hoxton版本)

 python_lover 2020-01-14

文章目錄

    • 摘要
    • 單點登錄簡介
    • 創(chuàng)建oauth2-client模塊
    • 修改授權(quán)服務(wù)器配置
    • 網(wǎng)頁單點登錄演示
    • 調(diào)用接口單點登錄演示
    • oauth2-client添加權(quán)限校驗
    • 使用到的模塊
    • 項目源碼地址

項目使用的Spring Cloud為Hoxton版本,Spring Boot為2.2.2.RELEASE版本

摘要

Spring Cloud Security 為構(gòu)建安全的SpringBoot應(yīng)用提供了一系列解決方案,結(jié)合Oauth2可以實現(xiàn)單點登錄功能,本文將對其單點登錄用法進行詳細(xì)介紹。

單點登錄簡介

單點登錄(Single Sign On)指的是當(dāng)有多個系統(tǒng)需要登錄時,用戶只需登錄一個系統(tǒng),就可以訪問其他需要登錄的系統(tǒng)而無需登錄。

創(chuàng)建oauth2-client模塊

這里我們創(chuàng)建一個oauth2-client服務(wù)作為需要登錄的客戶端服務(wù),使用上一節(jié)中的oauth2-jwt-server服務(wù)作為授權(quán)服務(wù),當(dāng)我們在oauth2-jwt-server服務(wù)上登錄以后,就可以直接訪問oauth2-client需要登錄的接口,來演示下單點登錄功能。

在pom.xml中添加相關(guān)依賴:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-security</artifactId>
</dependency>

在application.yml中進行配置:

server:
  port: 9501
  servlet:
    session:
      cookie:
        # 防止cookie沖突,沖突會導(dǎo)致登錄驗證不通過
        name: OAUTH2-CLIENT-SESSIONID

oauth2-service-url: http://localhost:9401

spring:
  application:
    name: oauth2-client

security:
  # 與oauth2-server對應(yīng)的配置
  oauth2:
    client:
      client-id: admin
      client-secret: admin123456
      user-authorization-uri: ${oauth2-service-url}/oauth/authorize
      access-token-uri: ${oauth2-service-url}/oauth/token
    resource:
      jwt:
        key-uri: ${oauth2-service-url}/oauth/token_key

在啟動類上添加@EnableOAuth2Sso注解來啟用單點登錄功能:

@EnableOAuth2Sso
@SpringBootApplication
public class Oauth2ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(Oauth2ClientApplication.class, args);
    }

}

添加接口用于獲取當(dāng)前登錄用戶信息:

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getCurrentUser")
    public Object getCurrentUser(Authentication authentication) {
        return authentication;
    }

}

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

修改oauth2-jwt-server模塊中的AuthorizationServerConfig類,將綁定的跳轉(zhuǎn)路徑為http://localhost:9501/login,并添加獲取秘鑰時的身份認(rèn)證。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    //以上省略一堆代碼...
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                // 配置client_id
                .withClient("admin")
                // 配置client_secret
                .secret(passwordEncoder.encode("admin123456"))
                // 配置訪問token的有效期
                .accessTokenValiditySeconds(3600)
                // 配置刷新token的有效期
                .refreshTokenValiditySeconds(864000)
                // 配置redirect_uri,用于授權(quán)成功后的跳轉(zhuǎn)
                // .redirectUris("http://www.baidu.com")
                // 單點登錄時配置
                .redirectUris("http://localhost:9501/login")
                // 自動授權(quán)配置
                // .autoApprove(true)
                // 配置申請的權(quán)限范圍
                .scopes("all")
                // 配置grant_type,表示授權(quán)類型
                .authorizedGrantTypes("authorization_code", "password", "refresh_token");
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        // 獲取密鑰需要身份認(rèn)證,使用單點登錄時必須配置
        security.tokenKeyAccess("isAuthenticated()");
    }
}

網(wǎng)頁單點登錄演示

啟動oauth2-client服務(wù)和oauth2-jwt-server服務(wù);

訪問客戶端需要授權(quán)的接口http://localhost:9501/user/getCurrentUser會跳轉(zhuǎn)到授權(quán)服務(wù)的登錄界面;

在這里插入圖片描述

進行登錄操作后跳轉(zhuǎn)到授權(quán)頁面;

在這里插入圖片描述

授權(quán)后會跳轉(zhuǎn)到原來需要權(quán)限的接口地址,展示登錄用戶信息;

在這里插入圖片描述

如果需要跳過授權(quán)操作進行自動授權(quán)可以添加autoApprove(true)配置:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    //以上省略一堆代碼...
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                // 配置client_id
                .withClient("admin")
                // 配置client_secret
                .secret(passwordEncoder.encode("admin123456"))
                // 配置訪問token的有效期
                .accessTokenValiditySeconds(3600)
                // 配置刷新token的有效期
                .refreshTokenValiditySeconds(864000)
                // 配置redirect_uri,用于授權(quán)成功后的跳轉(zhuǎn)
                // .redirectUris("http://www.baidu.com")
                // 單點登錄時配置
                .redirectUris("http://localhost:9501/login")
                // 自動授權(quán)配置
                .autoApprove(true)
                // 配置申請的權(quán)限范圍
                .scopes("all")
                // 配置grant_type,表示授權(quán)類型
                .authorizedGrantTypes("authorization_code", "password", "refresh_token");
    }
}

調(diào)用接口單點登錄演示

這里我們使用Postman來演示下如何使用正確的方式調(diào)用需要登錄的客戶端接口。

訪問客戶端需要登錄的接口:http://localhost:9501/user/getCurrentUser

使用Oauth2認(rèn)證方式獲取訪問令牌:

在這里插入圖片描述

輸入獲取訪問令牌的相關(guān)信息,點擊請求令牌:

在這里插入圖片描述

此時會跳轉(zhuǎn)到授權(quán)服務(wù)器進行登錄操作:

在這里插入圖片描述

登錄成功后使用獲取到的令牌:

在這里插入圖片描述

最后請求接口可以獲取到如下信息:

{
	"authorities": [{
		"authority": "admin"
	}],
	"details": {
		"remoteAddress": "0:0:0:0:0:0:0:1",
		"sessionId": "6F5A553BB678C7272145FF9FF2A5D8F4",
		"tokenValue": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb3Vyd29uIiwic2NvcGUiOlsiYWxsIl0sImV4cCI6MTU3NzY4OTc2NiwiYXV0aG9yaXRpZXMiOlsiYWRtaW4iXSwianRpIjoiZjAwYjVkMGUtNjFkYi00YjBmLTkyNTMtOWQxZDYwOWM4ZWZmIiwiY2xpZW50X2lkIjoiYWRtaW4iLCJlbmhhbmNlIjoiZW5oYW5jZSBpbmZvIn0.zdgFTWJt3DnAsjpQRU6rNA_iM7gVHX7E9bCyF73MOSM",
		"tokenType": "bearer",
		"decodedDetails": null
	},
	"authenticated": true,
	"userAuthentication": {
		"authorities": [{
			"authority": "admin"
		}],
		"details": null,
		"authenticated": true,
		"principal": "jourwon",
		"credentials": "N/A",
		"name": "jourwon"
	},
	"clientOnly": false,
	"oauth2Request": {
		"clientId": "admin",
		"scope": ["all"],
		"requestParameters": {
			"client_id": "admin"
		},
		"resourceIds": [],
		"authorities": [],
		"approved": true,
		"refresh": false,
		"redirectUri": null,
		"responseTypes": [],
		"extensions": {},
		"grantType": null,
		"refreshTokenRequest": null
	},
	"principal": "jourwon",
	"credentials": "",
	"name": "jourwon"
}

oauth2-client添加權(quán)限校驗

添加配置開啟基于方法的權(quán)限校驗:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(101)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

在UserController中添加需要admin權(quán)限的接口:

@RestController
@RequestMapping("/user")
public class UserController {

    @PreAuthorize("hasAuthority('admin')")
    @GetMapping("/auth/admin")
    public Object adminAuth() {
        return "Has admin auth!";
    }

}

訪問需要admin權(quán)限的接口:http://localhost:9501/user/auth/admin

在這里插入圖片描述

使用沒有admin權(quán)限的賬號,比如andy:123456獲取令牌后訪問該接口,會發(fā)現(xiàn)沒有權(quán)限訪問。

在這里插入圖片描述

使用到的模塊

springcloud-learning
├── oauth2-jwt-server -- 使用jwt的oauth2認(rèn)證測試服務(wù)
└── oauth2-client -- 單點登錄的oauth2客戶端服務(wù)

項目源碼地址

GitHub項目源碼地址

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品人妻一区二区三区四在线| 亚洲国产黄色精品在线观看| 五月婷婷缴情七月丁香 | 日本一区不卡在线观看| 色婷婷激情五月天丁香| 国产人妻精品区一区二区三区| 69精品一区二区蜜桃视频| 深夜福利亚洲高清性感| 国产一区二区三区色噜噜| 精品日韩欧美一区久久| 中文字幕一区二区三区中文| 日韩精品视频免费观看| 国产一级性生活录像片| 欧美黑人在线精品极品| 日韩无套内射免费精品| 丝袜人妻夜夜爽一区二区三区| 日韩精品人妻少妇一区二区| 日韩中文字幕视频在线高清版| 在线观看日韩欧美综合黄片| 五月的丁香婷婷综合网| 日韩高清毛片免费观看| 亚洲中文字幕在线乱码av| 东京干男人都知道的天堂| 欧美日韩国产另类一区二区| 亚洲高清一区二区高清| 青青免费操手机在线视频| 亚洲中文字幕亲近伦片| 国产亚洲不卡一区二区| 国内尹人香蕉综合在线| 99福利一区二区视频| 91亚洲精品国产一区| 99免费人成看国产片| 一区二区三区国产日韩| 亚洲淫片一区二区三区| 精品欧美在线观看国产| 老司机精品视频在线免费看| 亚洲熟女少妇精品一区二区三区| 日韩成人h视频在线观看| 久久国产成人精品国产成人亚洲| 日韩成人高清免费在线| 中文字幕日产乱码一区二区|