Commit fba728e6 authored by 李超鹏's avatar 李超鹏

调整认证方式

parent 4c313f61
Pipeline #7454 canceled with stages
package cc.shenjiying.ai; package cc.shenjiying.ai;
import io.smallrye.common.annotation.Blocking;
import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application; import jakarta.ws.rs.core.Application;
import org.eclipse.microprofile.openapi.annotations.Components; import org.eclipse.microprofile.openapi.annotations.Components;
...@@ -44,6 +45,6 @@ import org.eclipse.microprofile.openapi.annotations.tags.Tag; ...@@ -44,6 +45,6 @@ import org.eclipse.microprofile.openapi.annotations.tags.Tag;
) )
) )
@Blocking
public class SimpleApplication extends Application { public class SimpleApplication extends Application {
} }
package cc.shenjiying.ai.client;
import cc.shenjiying.ai.dto.QuickSearchResponse;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import org.jboss.resteasy.reactive.RestQuery;
@RegisterRestClient(configKey = "qs")
@Path("/anno/api")
@RegisterClientHeaders(KnowLedgeRequestHeaderFactory.class)
public interface QuickSearchApi {
@GET
@Path("/vip")
QuickSearchResponse getVip(@RestQuery("token") String token);
}
package cc.shenjiying.ai.common.dto; package cc.shenjiying.ai.common.dto;
import cc.shenjiying.ai.config.QuestionerHolder;
import cc.shenjiying.ai.repository.entity.Questioner;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
...@@ -14,4 +16,10 @@ public class AuthInfo { ...@@ -14,4 +16,10 @@ public class AuthInfo {
private String mobile; private String mobile;
private String channel; private String channel;
private String channelUserId; private String channelUserId;
public static AuthInfo formQuestioner(Questioner questioner) {
return new AuthInfo().setNickname(questioner.getAccount()).setId((questioner.getId())).setAccount(questioner.getAccount())
.setMobile(questioner.getMobile()).setChannel(questioner.getChannel()).setChannelUserId(questioner.getChannelUserId());
}
} }
...@@ -3,6 +3,8 @@ package cc.shenjiying.ai.config.filters; ...@@ -3,6 +3,8 @@ package cc.shenjiying.ai.config.filters;
import cc.shenjiying.ai.common.dto.AuthInfo; import cc.shenjiying.ai.common.dto.AuthInfo;
import cc.shenjiying.ai.common.dto.R; import cc.shenjiying.ai.common.dto.R;
import cc.shenjiying.ai.config.QuestionerHolder; import cc.shenjiying.ai.config.QuestionerHolder;
import cc.shenjiying.ai.dto.VipInfoDTO;
import cc.shenjiying.ai.manager.ChannelTokenService;
import cc.shenjiying.ai.manager.QuestionerService; import cc.shenjiying.ai.manager.QuestionerService;
import cc.shenjiying.ai.repository.entity.Questioner; import cc.shenjiying.ai.repository.entity.Questioner;
import cc.shenjiying.ai.util.IpUtils; import cc.shenjiying.ai.util.IpUtils;
...@@ -12,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -12,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.logging.Log; import io.quarkus.logging.Log;
import io.quarkus.runtime.util.StringUtil; import io.quarkus.runtime.util.StringUtil;
import io.smallrye.jwt.auth.principal.JWTParser; import io.smallrye.jwt.auth.principal.JWTParser;
import io.smallrye.mutiny.Uni;
import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerRequest;
import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject; import jakarta.inject.Inject;
...@@ -23,6 +26,7 @@ import org.jboss.resteasy.reactive.RestResponse; ...@@ -23,6 +26,7 @@ import org.jboss.resteasy.reactive.RestResponse;
import org.jboss.resteasy.reactive.server.ServerRequestFilter; import org.jboss.resteasy.reactive.server.ServerRequestFilter;
import org.jboss.resteasy.reactive.server.ServerResponseFilter; import org.jboss.resteasy.reactive.server.ServerResponseFilter;
import java.time.LocalDateTime;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
...@@ -35,13 +39,17 @@ import static cc.shenjiying.ai.config.QuestionerHolder.TOKEN_KEY; ...@@ -35,13 +39,17 @@ import static cc.shenjiying.ai.config.QuestionerHolder.TOKEN_KEY;
// 返回 null or empty 代表继续执行链,其他则返回给客户端 // 返回 null or empty 代表继续执行链,其他则返回给客户端
@ApplicationScoped @ApplicationScoped
public class TokenFilter { public class TokenFilter {
@Inject @Inject
JWTParser jwtParser; JWTParser jwtParser;
@Inject @Inject
ObjectMapper objectMapper; ObjectMapper objectMapper;
@Inject
QuestionerService questionerService;
@Inject
ChannelTokenService channelTokenService;
private List<String> ignoreUrl = Arrays.asList("/questioner/login", "/questioner/login/code"); private List<String> ignoreUrl = Arrays.asList("/questioner/login", "/questioner/login/code");
private boolean isIgnore(String url) { private boolean isIgnore(String url) {
...@@ -50,7 +58,37 @@ public class TokenFilter { ...@@ -50,7 +58,37 @@ public class TokenFilter {
@ServerRequestFilter(priority = 2000) @ServerRequestFilter(priority = 2000)
public RestResponse<String> request(ContainerRequestContext context, @Context HttpServerRequest request) throws JsonProcessingException { public RestResponse<String> request(ContainerRequestContext context, @Context HttpServerRequest request) throws Exception {
return channelToken(request);
// // h5 手机号登录 token认证
// return h5Token(context);
}
private RestResponse<String> channelToken(HttpServerRequest request) throws JsonProcessingException {
String channel = request.getParam(FROM_CHANNEL_KEY);
String channelToken = request.getParam(TOKEN_KEY);
VipInfoDTO vip = channelTokenService.getVip(channel, channelToken);
if (Objects.isNull(vip) || vip.getVipTerminationTime().isBefore(LocalDateTime.now())) {// 非会员提示不能使用
return RestResponse.status(Response.Status.FORBIDDEN, objectMapper.writeValueAsString(R.fail("非会员用户无法享受此功能,请考虑升级为会员。")));
}
Questioner questioner = questionerService.getByChannel(channel, vip.getId());
if (Objects.isNull(questioner)) {
questioner = new Questioner().setChannel(channel).setChannelUserId(vip.getId()).setAccount(vip.getUserName()).setCreateTime(LocalDateTime.now())
.setMobile(vip.getMobile());
try {
questionerService.save(questioner);
} catch (Exception e) {
questioner = questionerService.getByChannel(channel, vip.getId());
}
}
QuestionerHolder.putQuestioner(AuthInfo.formQuestioner(questioner));
QuestionerHolder.putChannel(channel);
return null;
}
private RestResponse<String> h5Token(ContainerRequestContext context) throws JsonProcessingException {
String channel = context.getHeaderString(FROM_CHANNEL_KEY); String channel = context.getHeaderString(FROM_CHANNEL_KEY);
channel = StringUtil.isNullOrEmpty(channel) ? "qs" : ""; channel = StringUtil.isNullOrEmpty(channel) ? "qs" : "";
String token = context.getHeaderString(TOKEN_KEY); String token = context.getHeaderString(TOKEN_KEY);
......
package cc.shenjiying.ai.dto;
import lombok.Data;
@Data
public class QuickSearchResponse {
private int code;
private String msg;
private VipInfoDTO data;
}
package cc.shenjiying.ai.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class VipInfoDTO {
private String id;
private String userName;
private String mobile;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime vipTerminationTime;
}
package cc.shenjiying.ai.manager;
import cc.shenjiying.ai.client.QuickSearchApi;
import cc.shenjiying.ai.dto.QuickSearchResponse;
import cc.shenjiying.ai.dto.VipInfoDTO;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
@ApplicationScoped
public class ChannelTokenService {
@Inject
@RestClient
QuickSearchApi quickSearchApi;
public VipInfoDTO getVip(String channel, String token) {
QuickSearchResponse response = quickSearchApi.getVip(token);
if (response.getCode() == 0) {
return response.getData();
}
return null;
}
}
...@@ -37,6 +37,11 @@ quarkus.rest-client.ai.url=http://115.159.4.244:7861 ...@@ -37,6 +37,11 @@ quarkus.rest-client.ai.url=http://115.159.4.244:7861
quarkus.rest-client.ai.scope=jakarta.inject.Singleton quarkus.rest-client.ai.scope=jakarta.inject.Singleton
quarkus.rest-client.ai.verify-host=false quarkus.rest-client.ai.verify-host=false
quarkus.rest-client.ai.follow-redirects=true quarkus.rest-client.ai.follow-redirects=true
#\u5FEB\u67E5api
quarkus.rest-client.qs.url=https://api-qs.kaying.cc
quarkus.rest-client.qs.scope=jakarta.inject.Singleton
quarkus.rest-client.qs.verify-host=false
quarkus.rest-client.qs.follow-redirects=true
#\u6570\u636E\u5E93\u914D\u7F6E #\u6570\u636E\u5E93\u914D\u7F6E
quarkus.datasource.db-kind=mysql quarkus.datasource.db-kind=mysql
quarkus.datasource.username=sts quarkus.datasource.username=sts
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment