mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-22 02:50:00 +08:00
add 新增 OAuth2 相关依赖以及配置 ;
update 更新登录接口, 返回 AccessToken (登录接口正常, 但无法获取 LoginUser) ;
This commit is contained in:
parent
fa99b7c9e3
commit
155fa7b205
7
pom.xml
7
pom.xml
@ -191,6 +191,13 @@
|
|||||||
<version>${satoken.version}</version>
|
<version>${satoken.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Sa-Token-OAuth2.0 模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.dev33</groupId>
|
||||||
|
<artifactId>sa-token-oauth2</artifactId>
|
||||||
|
<version>${satoken.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- dynamic-datasource 多数据源-->
|
<!-- dynamic-datasource 多数据源-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
|
|||||||
@ -53,13 +53,17 @@ public class AuthController {
|
|||||||
@PostMapping("/login/{clientId}/{authType}")
|
@PostMapping("/login/{clientId}/{authType}")
|
||||||
public <T> R<LoginVo> login(@PathVariable String clientId,
|
public <T> R<LoginVo> login(@PathVariable String clientId,
|
||||||
@PathVariable String authType,
|
@PathVariable String authType,
|
||||||
|
@RequestParam(required = false) String tenantId,
|
||||||
@Validated @RequestBody T loginBody) {
|
@Validated @RequestBody T loginBody) {
|
||||||
|
// FIXME 后续不用泛型传参,考虑改为 req 获取
|
||||||
// 校验类型和id
|
// 校验类型和id
|
||||||
loginService.checkAuthType(clientId, authType);
|
loginService.checkAuthType(clientId, authType);
|
||||||
|
// FIXME 抽取出来,校验租户,前端没改暂时注释
|
||||||
|
// loginService.checkTenant(tenantId);
|
||||||
// 登录
|
// 登录
|
||||||
LoginVo loginVo = new LoginVo();
|
LoginVo loginVo = new LoginVo();
|
||||||
IAuthStrategy authStrategy = AuthFactory.instance(authType);
|
IAuthStrategy authStrategy = AuthFactory.instance(authType);
|
||||||
String token = authStrategy.login(authStrategy.getLoginBody(loginBody));
|
String token = authStrategy.login(clientId, authStrategy.getLoginBody(loginBody));
|
||||||
loginVo.setToken(token);
|
loginVo.setToken(token);
|
||||||
return R.ok(loginVo);
|
return R.ok(loginVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,6 @@ public interface IAuthStrategy<T> {
|
|||||||
/**
|
/**
|
||||||
* 登录
|
* 登录
|
||||||
*/
|
*/
|
||||||
String login(T loginBody);
|
String login(String clientId, T loginBody);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,7 +46,7 @@ public class EmailAuthStrategy implements IAuthStrategy<EmailLoginBody> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String login(EmailLoginBody loginBody) {
|
public String login(String clientId, EmailLoginBody loginBody) {
|
||||||
String tenantId = loginBody.getTenantId();
|
String tenantId = loginBody.getTenantId();
|
||||||
String email = loginBody.getEmail();
|
String email = loginBody.getEmail();
|
||||||
String emailCode = loginBody.getEmailCode();
|
String emailCode = loginBody.getEmailCode();
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
package org.dromara.web.service.impl;
|
package org.dromara.web.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.oauth2.logic.SaOAuth2Util;
|
||||||
|
import cn.dev33.satoken.oauth2.model.AccessTokenModel;
|
||||||
|
import cn.dev33.satoken.oauth2.model.RequestAuthModel;
|
||||||
import cn.dev33.satoken.secure.BCrypt;
|
import cn.dev33.satoken.secure.BCrypt;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
@ -51,7 +54,7 @@ public class PasswordAuthStrategy implements IAuthStrategy<LoginBody> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String login(LoginBody loginBody) {
|
public String login(String clientId, LoginBody loginBody) {
|
||||||
String tenantId = loginBody.getTenantId();
|
String tenantId = loginBody.getTenantId();
|
||||||
String username = loginBody.getUsername();
|
String username = loginBody.getUsername();
|
||||||
String password = loginBody.getPassword();
|
String password = loginBody.getPassword();
|
||||||
@ -75,7 +78,13 @@ public class PasswordAuthStrategy implements IAuthStrategy<LoginBody> {
|
|||||||
|
|
||||||
loginService.recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
|
loginService.recordLogininfor(loginUser.getTenantId(), username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
|
||||||
loginService.recordLoginInfo(user.getUserId());
|
loginService.recordLoginInfo(user.getUserId());
|
||||||
return StpUtil.getTokenValue();
|
|
||||||
|
// FIXME 参考 demo 生成 AccessToken,但是 loginUser 获取不到值,未解决
|
||||||
|
RequestAuthModel ra = new RequestAuthModel();
|
||||||
|
ra.clientId = clientId;
|
||||||
|
ra.loginId = StpUtil.getLoginId();
|
||||||
|
AccessTokenModel at = SaOAuth2Util.generateAccessToken(ra, true);
|
||||||
|
return at.accessToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -46,7 +46,7 @@ public class SmsAuthStrategy implements IAuthStrategy<SmsLoginBody> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String login(SmsLoginBody loginBody) {
|
public String login(String clientId, SmsLoginBody loginBody) {
|
||||||
String tenantId = loginBody.getTenantId();
|
String tenantId = loginBody.getTenantId();
|
||||||
String phonenumber = loginBody.getPhonenumber();
|
String phonenumber = loginBody.getPhonenumber();
|
||||||
String smsCode = loginBody.getSmsCode();
|
String smsCode = loginBody.getSmsCode();
|
||||||
|
|||||||
@ -35,7 +35,7 @@ public class XcxAuthStrategy implements IAuthStrategy<XcxLoginBody> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String login(XcxLoginBody loginBody) {
|
public String login(String clientId, XcxLoginBody loginBody) {
|
||||||
// xcxCode 为 小程序调用 wx.login 授权后获取
|
// xcxCode 为 小程序调用 wx.login 授权后获取
|
||||||
String xcxCode = loginBody.getXcxCode();
|
String xcxCode = loginBody.getXcxCode();
|
||||||
// todo 以下自行实现
|
// todo 以下自行实现
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
package org.dromara.common.core.domain.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权管理对象
|
||||||
|
*
|
||||||
|
* @author Michelle.Chung
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AuthBody implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端id
|
||||||
|
*/
|
||||||
|
private String clientId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端key
|
||||||
|
*/
|
||||||
|
private String clientKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端秘钥
|
||||||
|
*/
|
||||||
|
private String clientSecret;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权类型
|
||||||
|
*/
|
||||||
|
private String authType;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
import org.dromara.common.core.domain.model.AuthBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用 认证服务
|
||||||
|
*
|
||||||
|
* @author Michelle.Chung
|
||||||
|
*/
|
||||||
|
public interface AuthService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取认证授权对象
|
||||||
|
*
|
||||||
|
* @param clientId 客户端id
|
||||||
|
*/
|
||||||
|
AuthBody getAuthBody(String clientId);
|
||||||
|
|
||||||
|
}
|
||||||
@ -36,6 +36,12 @@
|
|||||||
<artifactId>sa-token-jwt</artifactId>
|
<artifactId>sa-token-jwt</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Sa-Token-OAuth2.0 模块 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.dev33</groupId>
|
||||||
|
<artifactId>sa-token-oauth2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -0,0 +1,60 @@
|
|||||||
|
package org.dromara.common.satoken.core.service;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.oauth2.logic.SaOAuth2Template;
|
||||||
|
import cn.dev33.satoken.oauth2.model.SaClientModel;
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import org.dromara.common.core.domain.model.AuthBody;
|
||||||
|
import org.dromara.common.core.service.AuthService;
|
||||||
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sa-Token-OAuth2 模块实现类
|
||||||
|
*
|
||||||
|
* @author Michelle.Chung
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SaOAuth2TemplateImpl extends SaOAuth2Template {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重写 Access-Token 生成策略:复用登录会话的Token
|
||||||
|
*
|
||||||
|
* @param clientId 应用id
|
||||||
|
* @param loginId 账号id
|
||||||
|
* @param scope 权限
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String randomAccessToken(String clientId, Object loginId, String scope) {
|
||||||
|
String tokenValue = StpUtil.createLoginSession(loginId);
|
||||||
|
return tokenValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据 id 获取 Client 信息
|
||||||
|
*
|
||||||
|
* @param clientId 应用id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public SaClientModel getClientModel(String clientId) {
|
||||||
|
AuthService authService = SpringUtils.getBean(AuthService.class);
|
||||||
|
AuthBody authBody = authService.getAuthBody(clientId);
|
||||||
|
return new SaClientModel()
|
||||||
|
.setClientId(clientId)
|
||||||
|
.setClientSecret(authBody.getClientSecret())
|
||||||
|
.setAllowUrl("*")
|
||||||
|
.setIsPassword(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据ClientId 和 LoginId 获取openid
|
||||||
|
*
|
||||||
|
* @param clientId 应用id
|
||||||
|
* @param loginId 账号id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getOpenid(String clientId, Object loginId) {
|
||||||
|
// 此为模拟数据,真实环境需要从数据库查询
|
||||||
|
return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,5 +1,11 @@
|
|||||||
package org.dromara.system.service.impl;
|
package org.dromara.system.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import org.dromara.common.core.domain.model.AuthBody;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.common.core.exception.user.AuthTypeErrorException;
|
||||||
|
import org.dromara.common.core.service.AuthService;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@ -27,7 +33,7 @@ import java.util.Collection;
|
|||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
public class SysAuthServiceImpl implements ISysAuthService {
|
public class SysAuthServiceImpl implements ISysAuthService, AuthService {
|
||||||
|
|
||||||
private final SysAuthMapper baseMapper;
|
private final SysAuthMapper baseMapper;
|
||||||
|
|
||||||
@ -111,4 +117,13 @@ public class SysAuthServiceImpl implements ISysAuthService {
|
|||||||
return baseMapper.deleteBatchIds(ids) > 0;
|
return baseMapper.deleteBatchIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthBody getAuthBody(String clientId) {
|
||||||
|
SysAuth sysAuth = baseMapper.selectOne(
|
||||||
|
new LambdaQueryWrapper<SysAuth>().eq(SysAuth::getClientId, clientId));
|
||||||
|
if (ObjectUtil.isEmpty(sysAuth)) {
|
||||||
|
throw new ServiceException("clientId 错误");
|
||||||
|
}
|
||||||
|
return BeanUtil.toBean(sysAuth, AuthBody.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user