123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package com.pavis.admin.auth;
- import cn.dev33.satoken.stp.StpUtil;
- import cn.dev33.satoken.stp.parameter.SaLoginParameter;
- import cn.hutool.core.bean.BeanUtil;
- import jakarta.annotation.Resource;
- import jakarta.servlet.http.HttpServletRequest;
- import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
- import org.springframework.stereotype.Component;
- import com.pavis.admin.auth.model.req.LoginReq;
- import com.pavis.admin.common.context.RoleContext;
- import com.pavis.admin.common.context.UserContext;
- import com.pavis.admin.common.context.UserContextHolder;
- import com.pavis.admin.common.context.UserExtraContext;
- import com.pavis.admin.common.enums.DisEnableStatusEnum;
- import com.pavis.admin.system.model.entity.DeptDO;
- import com.pavis.admin.system.model.entity.user.UserDO;
- import com.pavis.admin.system.model.resp.ClientResp;
- import com.pavis.admin.system.service.DeptService;
- import com.pavis.admin.system.service.OptionService;
- import com.pavis.admin.system.service.RoleService;
- import com.pavis.admin.system.service.UserService;
- import top.continew.starter.core.validation.CheckUtils;
- import top.continew.starter.core.validation.Validator;
- import top.continew.starter.web.util.ServletUtils;
- import java.util.Set;
- import java.util.concurrent.CompletableFuture;
- import static com.pavis.admin.system.enums.PasswordPolicyEnum.PASSWORD_EXPIRATION_DAYS;
- /**
- * 登录处理器基类
- *
- *
- *
- * @since 2024/12/22 14:52
- */
- @Component
- public abstract class AbstractLoginHandler<T extends LoginReq> implements LoginHandler<T> {
- @Resource
- protected OptionService optionService;
- @Resource
- protected UserService userService;
- @Resource
- protected RoleService roleService;
- @Resource
- private DeptService deptService;
- @Resource
- private ThreadPoolTaskExecutor threadPoolTaskExecutor;
- protected static final String CAPTCHA_EXPIRED = "验证码已失效";
- protected static final String CAPTCHA_ERROR = "验证码不正确";
- protected static final String CLIENT_ID = "clientId";
- @Override
- public void preLogin(T req, ClientResp client, HttpServletRequest request) {
- // 参数校验
- Validator.validate(req);
- }
- @Override
- public void postLogin(T req, ClientResp client, HttpServletRequest request) {
- }
- /**
- * 认证
- *
- * @param user 用户信息
- * @param client 客户端信息
- * @return token 令牌信息
- */
- protected String authenticate(UserDO user, ClientResp client) {
- // 获取权限、角色、密码过期天数
- Long userId = user.getId();
- CompletableFuture<Set<String>> permissionFuture = CompletableFuture.supplyAsync(() -> roleService
- .listPermissionByUserId(userId), threadPoolTaskExecutor);
- CompletableFuture<Set<RoleContext>> roleFuture = CompletableFuture.supplyAsync(() -> roleService
- .listByUserId(userId), threadPoolTaskExecutor);
- CompletableFuture<Integer> passwordExpirationDaysFuture = CompletableFuture.supplyAsync(() -> optionService
- .getValueByCode2Int(PASSWORD_EXPIRATION_DAYS.name()));
- CompletableFuture.allOf(permissionFuture, roleFuture, passwordExpirationDaysFuture);
- UserContext userContext = new UserContext(permissionFuture.join(), roleFuture
- .join(), passwordExpirationDaysFuture.join());
- BeanUtil.copyProperties(user, userContext);
- // 设置登录配置参数
- SaLoginParameter loginParameter = new SaLoginParameter();
- loginParameter.setActiveTimeout(client.getActiveTimeout());
- loginParameter.setTimeout(client.getTimeout());
- loginParameter.setDeviceType(client.getClientType());
- userContext.setClientType(client.getClientType());
- loginParameter.setExtra(CLIENT_ID, client.getClientId());
- userContext.setClientId(client.getClientId());
- // 登录并缓存用户信息
- StpUtil.login(userContext.getId(), loginParameter.setExtraData(BeanUtil
- .beanToMap(new UserExtraContext(ServletUtils.getRequest()))));
- UserContextHolder.setContext(userContext);
- return StpUtil.getTokenValue();
- }
- /**
- * 检查用户状态
- *
- * @param user 用户信息
- */
- protected void checkUserStatus(UserDO user) {
- CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, user.getStatus(), "此账号已被禁用,如有疑问,请联系管理员");
- DeptDO dept = new DeptDO();
- if (user.getDeptId() != null) {
- dept = deptService.getById(user.getDeptId());
- } else {
- dept = deptService.getById(1);
- }
- CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, dept.getStatus(), "此账号所属部门已被禁用,如有疑问,请联系管理员");
- }
- }
|