feat: [auth] PowerJobAuthService's login by jwt

This commit is contained in:
tjq 2023-03-25 23:42:34 +08:00
parent 73e9c49e2b
commit 9ce59cab9f

View File

@ -13,6 +13,7 @@ import tech.powerjob.server.auth.Permission;
import tech.powerjob.server.auth.PowerJobUser; import tech.powerjob.server.auth.PowerJobUser;
import tech.powerjob.server.auth.Role; import tech.powerjob.server.auth.Role;
import tech.powerjob.server.auth.anno.ApiPermission; import tech.powerjob.server.auth.anno.ApiPermission;
import tech.powerjob.server.auth.jwt.JwtService;
import tech.powerjob.server.auth.login.BizLoginService; import tech.powerjob.server.auth.login.BizLoginService;
import tech.powerjob.server.auth.login.BizUser; import tech.powerjob.server.auth.login.BizUser;
import tech.powerjob.server.persistence.remote.model.UserInfoDO; import tech.powerjob.server.persistence.remote.model.UserInfoDO;
@ -20,6 +21,7 @@ import tech.powerjob.server.persistence.remote.model.UserRoleDO;
import tech.powerjob.server.persistence.remote.repository.UserInfoRepository; import tech.powerjob.server.persistence.remote.repository.UserInfoRepository;
import tech.powerjob.server.persistence.remote.repository.UserRoleRepository; import tech.powerjob.server.persistence.remote.repository.UserRoleRepository;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
@ -32,14 +34,18 @@ import java.util.*;
@Service @Service
public class PowerJobLoginServiceImpl implements PowerJobAuthService { public class PowerJobLoginServiceImpl implements PowerJobAuthService {
private final JwtService jwtService;
private final UserInfoRepository userInfoRepository; private final UserInfoRepository userInfoRepository;
private final UserRoleRepository userRoleRepository; private final UserRoleRepository userRoleRepository;
private final Map<String, BizLoginService> type2LoginService = Maps.newHashMap(); private final Map<String, BizLoginService> type2LoginService = Maps.newHashMap();
private static final String TOKEN_HEADER_NAME = "power_token"; private static final String JWT_NAME = "powerjob_token";
private static final String KEY_USERID = "userId";
@Autowired @Autowired
public PowerJobLoginServiceImpl(List<BizLoginService> loginServices, UserInfoRepository userInfoRepository, UserRoleRepository userRoleRepository) { public PowerJobLoginServiceImpl(List<BizLoginService> loginServices, JwtService jwtService, UserInfoRepository userInfoRepository, UserRoleRepository userRoleRepository) {
this.jwtService = jwtService;
this.userInfoRepository = userInfoRepository; this.userInfoRepository = userInfoRepository;
this.userRoleRepository = userRoleRepository; this.userRoleRepository = userRoleRepository;
loginServices.forEach(k -> type2LoginService.put(k.type(), k)); loginServices.forEach(k -> type2LoginService.put(k.type(), k));
@ -84,15 +90,12 @@ public class PowerJobLoginServiceImpl implements PowerJobAuthService {
@Override @Override
public Optional<PowerJobUser> parse(HttpServletRequest httpServletRequest) { public Optional<PowerJobUser> parse(HttpServletRequest httpServletRequest) {
final Optional<String> usernameOpt = parseUsername(httpServletRequest); final Optional<Long> userIdOpt = parseUserId(httpServletRequest);
if (!usernameOpt.isPresent()) { return userIdOpt.flatMap(aLong -> userInfoRepository.findById(aLong).map(userInfoDO -> {
return Optional.empty();
}
return userInfoRepository.findByUsername(usernameOpt.get()).map(userInfoDO -> {
PowerJobUser powerJobUser = new PowerJobUser(); PowerJobUser powerJobUser = new PowerJobUser();
BeanUtils.copyProperties(usernameOpt, powerJobUser); BeanUtils.copyProperties(userInfoDO, powerJobUser);
return powerJobUser; return powerJobUser;
}); }));
} }
@Override @Override
@ -131,13 +134,26 @@ public class PowerJobLoginServiceImpl implements PowerJobAuthService {
return false; return false;
} }
private Optional<String> parseUsername(HttpServletRequest httpServletRequest) { private Optional<Long> parseUserId(HttpServletRequest httpServletRequest) {
final String tokenHeader = httpServletRequest.getHeader(TOKEN_HEADER_NAME); // headercookie 都能获取
if (StringUtils.isEmpty(tokenHeader)) { String jwtStr = httpServletRequest.getHeader(JWT_NAME);
if (StringUtils.isEmpty(jwtStr)) {
for (Cookie cookie : httpServletRequest.getCookies()) {
if (cookie.getName().equals(JWT_NAME)) {
jwtStr = cookie.getValue();
}
}
}
if (StringUtils.isEmpty(jwtStr)) {
return Optional.empty();
}
final Map<String, Object> jwtBodyMap = jwtService.parse(jwtStr);
final Object userId = jwtBodyMap.get(KEY_USERID);
if (userId == null) {
return Optional.empty(); return Optional.empty();
} }
// TODO: jwt token 解析 username return Optional.of(Long.parseLong(String.valueOf(userId)));
return Optional.empty();
} }
} }