package com.xjrsoft.module.system.service.impl; import cn.dev33.satoken.oauth2.logic.SaOAuth2Template; import cn.dev33.satoken.oauth2.model.SaClientModel; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.module.system.entity.Datasource; import com.xjrsoft.module.system.entity.OauthClientDetails; import com.xjrsoft.module.system.service.IOauthClientDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * Sa-Token OAuth2.0 整合实现 */ @Component public class SaOAuth2TemplateImpl extends SaOAuth2Template { @Autowired private IOauthClientDetailsService oauthClientDetailsService; // 根据 id 获取 Client 信息 @Override public SaClientModel getClientModel(String clientId) { OauthClientDetails oauthClientDetails = oauthClientDetailsService.getOne(Wrappers.query().lambda() .eq(OauthClientDetails::getClientId, clientId) .eq(OauthClientDetails::getStatus, 1)); if (oauthClientDetails == null) { throw new MyException("找不到此数据"); } return new SaClientModel() .setClientId(oauthClientDetails.getClientId()) .setClientSecret(oauthClientDetails.getClientSecret()) .setAllowUrl(oauthClientDetails.getAllowUrl()) .setContractScope(oauthClientDetails.getScope()) .setIsAutoMode(true); } // 根据ClientId 和 LoginId 获取openid @Override public String getOpenid(String clientId, Object loginId) { // 此为模拟数据,真实环境需要从数据库查询 return ""; } // 重写 Access-Token 生成策略:复用登录会话的Token @Override public String randomAccessToken(String clientId, Object loginId, String scope) { String tokenValue = StpUtil.createLoginSession(loginId); return tokenValue; } }