新聞中心
背景
若依框架現在很火,很多團隊與個人都使用它。作者看了看它最新的代碼,它的認證方式有所不同,前后臺分離版本使用的是shiro(具體代碼:https://gitee.com/y_project/RuoYi/tree/master/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro),微服務版本使用的是JWT(具體代碼:https://gitee.com/y_project/RuoYi-Cloud/blob/master/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java#L44)。不過很多時候,我們的組織或公司都已經構建了自己的認證系統(tǒng),這個時候如何把我們的若依開發(fā)的系統(tǒng)和我們的認證系統(tǒng)集成在一起呢。這篇文章就給出全過程保姆式的方法演示。

專注于為中小企業(yè)提供網站制作、做網站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)易門免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。
準備工作
搭建oauth2的認證服務
這個服務我們是基于spring-security-oauth2來實現的。依賴pom.xml如下:
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
${security.oauth2.version}
oauth2認證服務器的配置:
認證服務配置
服務測試
訪問/oauth/token使用參數列表如下,注意我們這個地方grant_type用的是password。
OAuth 2.0中常見的grant_type:
- authorization_code:用于通過授權碼獲取訪問令牌,通常用于Web應用程序或本機應用程序中。
- password:用于通過用戶名和密碼獲取訪問令牌,通常用于受信任的客戶端(如移動應用程序)中。
- client_credentials:用于客戶端憑據(如應用程序密鑰)獲取訪問令牌,通常用于機器到機器通信中。
- refresh_token:用于使用刷新令牌獲取新訪問令牌,通常用于在訪問令牌過期后更新訪問令牌。
|
client_id |
|
|
client_secret |
|
|
grant_type |
password |
|
scope |
|
|
username |
|
|
password |
測試授權服務器的接口
正式工作
下面以前后臺分離版本的若依為例。
- 增加依賴:
org.springframework.security.oauth.boot
spring-security-oauth2-autoconfigure
2.0.1.RELEASE
- 去掉shiro相關代碼(因為我們是基于spring-security-oauth來實現與認證服務器的對接)。
- 在WebsecurityConfig類上添加注解@EnableOAuth2Sso。
改造websecurityconfig
- application.yml中添加客戶端配置。
security:
oauth2:
client:
clientId: *****
clientSecret: *****
accessTokenUri: ${auth-server}/oauth/token
userAuthorizationUri: ${auth-server}/oauth/authorize
resource:
userInfoUri: ${auth-server}/system/user/get
redirectUri: *****其中userInfoUri是認證服務器提供的獲取用戶信息的接口。
- 修改ruoyi-ui的login.js中的登錄方法,使得它訪問認證服務器獲取token。
// 登錄方法
export function login(username, password, code, uuid) {
return root_request({
url: '/oauth/token',
method: 'post',
params: { username, password, code, uuid, client_id, client_secret, grant_type, scope }
})
}上面的root_request是我們新建的一個axios實例,它訪問的是認證服務器,而不是ruoyi的后臺。
const service = axios.create({
// axios中請求配置有baseURL選項,表示請求URL公共部分
baseURL: '/cgroot',
// 超時
timeout: 10000
})- vue.config.js中添加新的路由。
devServer: {
host: '0.0.0.0',
port: port,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
['/cgroot']: {
target: `http://localhost:8880`,
changeOrigin: true,
pathRewrite: {
['^' + '/cgroot']: ''
}
}
},
disableHostCheck: true
},- 獲取用戶的方法也要做修改。
/**
* 獲取用戶
**/
public static LoginUser getLoginUser()
{
try
{
OAuth2Authentication authentication = (OAuth2Authentication)getAuthentication();
Map userMap =
(Map) ((Map) authentication
.getUserAuthentication().getDetails()).get("data");
SysUser user = new SysUser();
Integer userId = (Integer) userMap.get("userId");
Integer proxyId = (Integer) userMap.get("proxyId");
String userName = (String) userMap.get("userName");
String avatar = (String) userMap.get("avatar");
String phonenumber = (String) userMap.get("phonenumber");
String email = (String) userMap.get("email");
String nickName = (String)userMap.get("nickName");
user.setUserId(Long.parseLong(String.valueOf(userId)));
user.setNickName(nickName);
user.setAvatar(avatar);
user.setPhonenumber(phonenumber);
user.setEmail(email);
user.setUserName(userName);
user.setProxyId(Long.parseLong(String.valueOf(proxyId)));
LoginUser loginUser = new LoginUser();
loginUser.setUser(user);
return loginUser;
}
catch (Exception e)
{
throw new CustomException("獲取用戶信息異常", HttpStatus.UNAUTHORIZED);
}
} 這樣便實現了ruoyi開發(fā)的系統(tǒng)與我們的第三方認證服務的對接。當然上面實現的是通過grant_type為password方式獲取token,如果通過authorization_code獲取token的話,上面的login方法里面需要用到重定向回來得到的code。
后記
上面的實現的關鍵是EnableOAuth2Sso這個注解,EnableOAuth2Sso是一個Spring Security的注解,用于在基于OAuth2的單點登錄(SSO)流程中啟用OAuth2 SSO支持。它實現在SpringSecurityFilterChain過濾器鏈上添加OAuth2ClientAuthenticationProcessingFilter這個用于登錄認證的Filter。它攔截用戶的請求,并通過access_token獲取認證服務器上的用戶信息,并創(chuàng)建Authentication登錄后憑證,并完成principal存儲,讓人感覺像ruoyi直接訪問數據庫拿到用戶信息一樣。
創(chuàng)建Authentication
參考文章
https://www.cnblogs.com/trust-freedom/p/12002089.html(EnableOAuth2Sso原理)。
https://www.rfc-editor.org/rfc/rfc6749 (OAuth2 RFC)。
本文標題:RuoYi開發(fā)框架與第三方認證系統(tǒng)集成起來的簡單方法
路徑分享:http://fisionsoft.com.cn/article/cocsssc.html


咨詢
建站咨詢
