浏览代码

添加app登录获取token,app退出登录

S0025136190 1 年之前
父节点
当前提交
60a567df5a

+ 24 - 0
takai-admin/src/main/java/org/dromara/web/controller/AuthController.java

@@ -3,6 +3,7 @@ package org.dromara.web.controller;
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.dtflys.forest.annotation.Post;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -17,6 +18,7 @@ import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
 import org.dromara.common.social.config.properties.SocialProperties;
 import org.dromara.common.social.utils.SocialUtils;
@@ -183,4 +185,26 @@ public class AuthController {
         return R.ok(vo);
     }
 
+    /**
+     * app登录
+     * @param loginBody
+     * @return
+     */
+    @PostMapping("/appLogin")
+    public R<String> wechatLogin(@Validated @RequestBody LoginBody loginBody){
+        String token = IAuthStrategy.wxLogin(loginBody);
+        return R.ok("操作成功", token);
+    }
+
+    /**
+     * app退出
+     * @return
+     */
+    @PostMapping("/appLogout")
+    public R<Void> wechatLogout() {
+        loginService.appLogout();
+        return R.ok("退出成功");
+    }
+
+
 }

+ 13 - 0
takai-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java

@@ -42,4 +42,17 @@ public interface IAuthStrategy {
      */
     LoginVo login(String clientId, LoginBody loginBody, SysClient client);
 
+    String appLogin(LoginBody loginBody);
+
+    static String wxLogin(LoginBody loginBody){
+        String grantType = loginBody.getGrantType();
+        String beanName = grantType + BASE_NAME;
+        if (!SpringUtils.containsBean(beanName)) {
+            throw new ServiceException("授权类型不正确!");
+        }
+        IAuthStrategy instance = SpringUtils.getBean(beanName);
+        instance.validate(loginBody);
+        return instance.appLogin(loginBody);
+    }
+
 }

+ 4 - 0
takai-admin/src/main/java/org/dromara/web/service/SysLoginService.java

@@ -224,4 +224,8 @@ public class SysLoginService {
         }
     }
 
+    public void appLogout() {
+        RedisUtils.deleteObject("LOGIN_USER_APP_KEY");
+    }
+
 }

+ 5 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java

@@ -80,6 +80,11 @@ public class EmailAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    @Override
+    public String appLogin(LoginBody loginBody) {
+        return null;
+    }
+
     /**
      * 校验邮箱验证码
      */

+ 49 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java

@@ -28,6 +28,7 @@ import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysClientService;
 import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.service.IAuthStrategy;
 import org.dromara.web.service.SysLoginService;
@@ -46,6 +47,10 @@ public class PasswordAuthStrategy implements IAuthStrategy {
     private final CaptchaProperties captchaProperties;
     private final SysLoginService loginService;
     private final SysUserMapper userMapper;
+    private final ISysClientService clientService;
+
+    public static final String LOGIN_USER_KEY = "loginUser";
+    public static final String LOGIN_USER_APP_KEY = "loginUserApp";
 
     @Override
     public void validate(LoginBody loginBody) {
@@ -90,6 +95,34 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    @Override
+    public String appLogin(LoginBody loginBody) {
+        String username = loginBody.getUsername();
+        String password = loginBody.getPassword();
+        String clientId = loginBody.getClientId();
+
+        SysUserVo user = loadUserByUsername(username);
+
+        loginService.checkLogin(LoginType.PASSWORD, null, username, () -> !BCrypt.checkpw(password, user.getPassword()));
+        // 此处可根据登录用户的数据不同 自行创建 loginUser
+        LoginUser loginUser = loginService.buildLoginUser(user);
+        SysClient client = clientService.queryByClientId(clientId);
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        //RedisUtils.deleteObject(errorKey);
+        StpUtil.getSession().set(LOGIN_USER_KEY, loginUser);
+        RedisUtils.setCacheObject("LOGIN_USER_APP_KEY", StpUtil.getTokenValue());
+        return RedisUtils.getCacheObject("LOGIN_USER_APP_KEY");
+    }
+
     /**
      * 校验验证码
      *
@@ -129,4 +162,20 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         return userMapper.selectUserByUserName(username);
     }
 
+    private SysUserVo loadUserByUsername(String username) {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+            .select(SysUser::getUserName, SysUser::getStatus)
+            .eq(SysUser::getUserName, username));
+        if (ObjectUtil.isNull(user)) {
+            log.info("登录用户:{} 不存在.", username);
+            throw new UserException("user.not.exists", username);
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+            log.info("登录用户:{} 已被停用.", username);
+            throw new UserException("user.blocked", username);
+        }
+        return userMapper.selectUserByUserName(username);
+    }
+
+
+
 }

+ 5 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java

@@ -80,6 +80,11 @@ public class SmsAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    @Override
+    public String appLogin(LoginBody loginBody) {
+        return null;
+    }
+
     /**
      * 校验短信验证码
      */

+ 5 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java

@@ -117,6 +117,11 @@ public class SocialAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    @Override
+    public String appLogin(LoginBody loginBody) {
+        return null;
+    }
+
     private SysUserVo loadUser(String tenantId, Long userId) {
         SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
             .select(SysUser::getUserName, SysUser::getStatus)

+ 5 - 0
takai-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java

@@ -77,6 +77,11 @@ public class XcxAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    @Override
+    public String appLogin(LoginBody loginBody) {
+        return null;
+    }
+
     private SysUserVo loadUserByOpenid(String openid) {
         // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户
         // todo 自行实现 userService.selectUserByOpenid(openid);

+ 1 - 1
takai-modules/takai-system/src/main/java/org/dromara/system/domain/vo/RegionVo.java

@@ -61,6 +61,6 @@ public class RegionVo implements Serializable {
 
     private String url;
 
-    private String createTime;
+    private Date createTime;
 
 }

+ 1 - 1
takai-modules/takai-system/src/main/java/org/dromara/system/domain/vo/RoomVo.java

@@ -82,7 +82,7 @@ public class RoomVo implements Serializable {
 
     private String url;
 
-    private String createTime;
+    private Date createTime;
 
 
 }

+ 1 - 1
takai-modules/takai-system/src/main/java/org/dromara/system/domain/vo/SysImgVo.java

@@ -63,7 +63,7 @@ public class SysImgVo implements Serializable {
 
     private boolean defaults;
 
-    private String createTime;
+    private Date createTime;
 
 
 }