diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index f75ef2915..6b29666ef 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -126,6 +126,7 @@ sa-token: security: # 排除路径 excludes: + - /app/appLogin #app用户登录放行 - /login - /logout - /register diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java index 9cd759f4a..05c796a28 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/LoginUtils.java @@ -52,18 +52,30 @@ public class LoginUtils { * 获取用户类型 */ public static UserType getUserType() { - String loginId = StpUtil.getLoginIdAsString(); + String loginId = null; + try { + loginId = StpUtil.getLoginIdAsString(); + } catch (Exception e) { + System.out.println("获取loginId出错,返回空"); + } return getUserType(loginId); } public static UserType getUserType(Object loginId) { + if (StringUtils.isEmpty(loginId)) { + return null; + } if (StringUtils.contains(loginId.toString(), UserType.SYS_USER.getUserType())) { return UserType.SYS_USER; } else if (StringUtils.contains(loginId.toString(), UserType.APP_USER.getUserType())){ return UserType.APP_USER; } else { - throw new UtilException("登录用户: LoginId异常 => " + loginId); +// throw new UtilException("登录用户: LoginId异常 => " + loginId); + return null;//这里如果查不出用户类型 就返回null } } + public static String getToken() { + return StpUtil.getTokenValue(); + } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/controller/AppController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/controller/AppController.java new file mode 100644 index 000000000..3599bd8e6 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/controller/AppController.java @@ -0,0 +1,51 @@ +package com.ruoyi.demo.app.controller; + +import cn.dev33.satoken.stp.StpUtil; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.UserType; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.demo.app.domain.AppUser; +import com.ruoyi.demo.app.domain.vo.AppUserVo; +import com.ruoyi.demo.app.utils.AppSecurityUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/* + *@DESCRIPTION + *@author ye + *@create 2021/9/28 19:10 + */ +@RestController +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RequestMapping("app") +public class AppController extends BaseController { + + @GetMapping("appLogin") + public AjaxResult appLogin(String code) { + UserType userType = LoginUtils.getUserType(); + if (userType == UserType.SYS_USER) { + return error("系统用户不能登录"); + } else if (userType == UserType.APP_USER) { + return AjaxResult.success("请求头有用户信息", AppSecurityUtils.getUser()); + } + //说明没有token或者token为空 这时候需要根据code来获取openid存到数据库 + String openid = "code" + code;//代表获取了openid + //保存一条数据 + AppUserVo appUser = new AppUserVo(); + appUser.setId(123L);//设置主键id + appUser.setOpenid(openid);//设置唯一用户标识 + appUser.setName("app" + openid);//设置一个昵称 + LoginUtils.login(appUser.getId(), UserType.APP_USER);//登录 + String token = LoginUtils.getToken();//获取token + appUser.setToken(token);//将token传回给前端 + + return AjaxResult.success("新用户注册成功",appUser); + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/AppUser.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/AppUser.java new file mode 100644 index 000000000..d2f2773cc --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/AppUser.java @@ -0,0 +1,16 @@ +package com.ruoyi.demo.app.domain; + +import lombok.Data; + +/* + *@DESCRIPTION + *@author ye + *@create 2021/9/28 19:18 + */ +@Data +public class AppUser { + + private Long id; + private String openid; + private String name; +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/vo/AppUserVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/vo/AppUserVo.java new file mode 100644 index 000000000..dc10f94d2 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/domain/vo/AppUserVo.java @@ -0,0 +1,18 @@ +package com.ruoyi.demo.app.domain.vo; + +import lombok.Data; + +/* + *@DESCRIPTION + *@author ye + *@create 2021/9/28 19:22 + */ +@Data +public class AppUserVo { + + private Long id; + private String openid; + private String name; + private String token; + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/mapper/AppUserMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/mapper/AppUserMapper.java new file mode 100644 index 000000000..a3dcbb3dd --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/mapper/AppUserMapper.java @@ -0,0 +1,9 @@ +package com.ruoyi.demo.app.mapper; + +import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.demo.app.domain.AppUser; + +public interface AppUserMapper extends BaseMapperPlus { + + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/IAppUserService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/IAppUserService.java new file mode 100644 index 000000000..13462c93f --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/IAppUserService.java @@ -0,0 +1,12 @@ +package com.ruoyi.demo.app.service; + +import com.ruoyi.demo.app.domain.AppUser; +import org.springframework.stereotype.Service; + +/* +* 接口 +* */ +public interface IAppUserService { + + AppUser queryById(Long id); +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/impl/AppUserServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/impl/AppUserServiceImpl.java new file mode 100644 index 000000000..4611d0af9 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/service/impl/AppUserServiceImpl.java @@ -0,0 +1,27 @@ +package com.ruoyi.demo.app.service.impl; + +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.ruoyi.demo.app.domain.AppUser; +import com.ruoyi.demo.app.domain.vo.AppUserVo; +import com.ruoyi.demo.app.mapper.AppUserMapper; +import com.ruoyi.demo.app.service.IAppUserService; +import org.springframework.stereotype.Service; + +/* + *@DESCRIPTION + *@author ye + *@create 2021/9/28 19:20 + */ +@Service +public class AppUserServiceImpl extends ServicePlusImpl implements IAppUserService { + + /*模拟查询用户*/ + @Override + public AppUser queryById(Long id) { + AppUser appUser = new AppUser(); + appUser.setId(id); + appUser.setName("app" + id); + return appUser; + } + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/app/utils/AppSecurityUtils.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/utils/AppSecurityUtils.java new file mode 100644 index 000000000..ce41401fe --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/app/utils/AppSecurityUtils.java @@ -0,0 +1,37 @@ +package com.ruoyi.demo.app.utils; + +import cn.hutool.http.HttpStatus; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.IUserService; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.LoginUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.demo.app.domain.AppUser; +import com.ruoyi.demo.app.service.IAppUserService; + +/* + *@DESCRIPTION + *@author ye + *@create 2021/9/28 19:55 + */ +public class AppSecurityUtils { + + /** + * 用户ID + **/ + public static Long getUserId() { + return LoginUtils.getUserId(); + } + + /** + * 获取用户 + **/ + public static AppUser getUser() { + try { + return SpringUtils.getBean(IAppUserService.class).queryById(getUserId()); + } catch (Exception e) { + throw new ServiceException("获取用户信息异常", HttpStatus.HTTP_UNAUTHORIZED); + } + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/MySaTokenListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/MySaTokenListener.java index b8bb76f31..f3153f080 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/MySaTokenListener.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/MySaTokenListener.java @@ -8,6 +8,7 @@ import cn.hutool.http.useragent.UserAgentUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.dto.UserOnlineDTO; import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.enums.UserType; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServletUtils; @@ -28,11 +29,15 @@ public class MySaTokenListener implements SaTokenListener { */ @Override public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) { - UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); - String ip = ServletUtils.getClientIP(); - SysUser user = SecurityUtils.getUser(); - String tokenValue = StpUtil.getTokenValue(); - UserOnlineDTO userOnlineDTO = new UserOnlineDTO() + /*这里的loginType在移动端登录的时候是login*/ + System.out.println(UserType.SYS_USER.getUserType());//sys_user: + if (loginType.equals(UserType.SYS_USER.getUserType())) { + /*系统用户才处理*/ + UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = ServletUtils.getClientIP(); + SysUser user = SecurityUtils.getUser(); + String tokenValue = StpUtil.getTokenValue(); + UserOnlineDTO userOnlineDTO = new UserOnlineDTO() .setIpaddr(ip) .setLoginLocation(AddressUtils.getRealAddressByIP(ip)) .setBrowser(userAgent.getBrowser().getName()) @@ -40,11 +45,12 @@ public class MySaTokenListener implements SaTokenListener { .setLoginTime(System.currentTimeMillis()) .setTokenId(tokenValue) .setUserName(user.getUserName()); - if (StringUtils.isNotNull(user.getDept())) { - userOnlineDTO.setDeptName(user.getDept().getDeptName()); + if (StringUtils.isNotNull(user.getDept())) { + userOnlineDTO.setDeptName(user.getDept().getDeptName()); + } + RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO); + log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); } - RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, userOnlineDTO); - log.info("user doLogin, useId:{}, token:{}", loginId, tokenValue); } /**