feat: 重构登录接口

This commit is contained in:
zhaoyixiang
2024-04-24 00:00:10 +08:00
parent 01ee96e0b6
commit 6dfaecddf8
6 changed files with 197 additions and 10 deletions

View File

@@ -49,6 +49,7 @@ dependencies {
implementation 'com.alibaba:easyexcel:3.3.3'
implementation 'com.baomidou:dynamic-datasource-spring-boot3-starter:4.3.0'
implementation 'com.github.xiaoymin:knife4j-openapi3-jakarta-spring-boot-starter:4.4.0'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}
tasks.named('test') {

View File

@@ -0,0 +1,17 @@
package com.realtime.protection.configuration.entity.user;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Yixiang Zhao
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AccessTokenResponse {
private String access_token;
private String token_type;
private int expires_in;
}

View File

@@ -2,9 +2,11 @@ package com.realtime.protection.configuration.entity.user;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long userId;

View File

@@ -0,0 +1,67 @@
package com.realtime.protection.configuration.entity.user;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author Yixiang Zhao
**/
public class UserFull {
public String ticket;
public List<Group> groups;
public List<Role> roles;
public List<Org> orgs;
public String mobile;
public String nickName;
public String email;
public String uid;
public String employeeNumber;
public String name;
public List<String> resoures;
public String getOrgCode() {
if (orgs.size() > 0) {
return orgs.get(0).orgCode;
}
return "";
}
public String getRoleKey() {
if (roles.size() > 0) {
return roles.get(0).roleKey;
}
return "";
}
}
class Group {
public int groupId;
public int applicationId;
public String groupKey;
public String groupName;
public String groupTag; // Assume it's a JSON String, otherwise it could be List<Tag> or similar
public String groupRemark;
}
class Role {
public int roleId;
public int applicationId;
public String roleKey;
public String roleName;
public String roleRemark;
public String roleTag; // Same assumption as above
public List<String> res; // Assuming a Resource class exists
public List<String> resources; // Assuming a Resource class exists
}
class Org {
public String orgName;
public String orgDescription;
public int orgParentId;
public String orgCode;
public String orgTag; // Same assumption as above
public int orgId;
public String userOrgworkType;
}

View File

@@ -1,11 +1,22 @@
package com.realtime.protection.server.user.login;
import com.realtime.protection.configuration.entity.user.User;
import com.realtime.protection.configuration.response.ResponseResult;
import org.springframework.web.bind.annotation.*;
import javax.security.auth.login.LoginException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.realtime.protection.configuration.entity.user.User;
import com.realtime.protection.configuration.entity.user.UserFull;
import com.realtime.protection.configuration.response.ResponseResult;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
// Just for example, not in production environment
@RestController
@RequestMapping("/user")
@@ -36,10 +47,29 @@ public class LoginController {
@PostMapping("/auth")
public ResponseResult auth(@RequestParam("sessionData") String sessionData,
@RequestParam("accessToken") String accessToken,
@Autowired HttpServletRequest request,
@RequestParam(value = "scopes", required = false) String scopes) {
return ResponseResult.ok().setMessage("success")
.setData("success", true);
try {
UserFull userFull = loginService.loginWithSSO(sessionData);
if (userFull == null) {
throw new LoginException("登录失败,无法获取用户信息");
}
// 设置 session
HttpSession session = request.getSession();
session.setAttribute("user", userFull);
// 返回结果
return ResponseResult.ok().setMessage("success")
.setData("userId", userFull.uid)
.setData("userName", userFull.name)
.setData("userRole", userFull.getRoleKey());
} catch (Exception e) {
return ResponseResult.error(e.getMessage());
}
}
@GetMapping("/auth_redirect")
public String authRedirect(@RequestParam(value = "SESSION_DATA", required = false) String sessionData) {
System.out.println("SESSION_DATA: " + sessionData);
return "";
}
}

View File

@@ -1,11 +1,26 @@
package com.realtime.protection.server.user.login;
import cn.dev33.satoken.stp.StpUtil;
import com.realtime.protection.configuration.entity.user.User;
import org.springframework.stereotype.Service;
import org.apache.logging.log4j.util.Strings;
import javax.security.auth.login.LoginException;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.realtime.protection.configuration.entity.user.AccessTokenResponse;
import com.realtime.protection.configuration.entity.user.User;
import com.realtime.protection.configuration.entity.user.UserFull;
import cn.dev33.satoken.stp.StpUtil;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import io.micrometer.common.util.StringUtils;
@Service
// just for example, not for production environment
public class LoginService {
@@ -28,4 +43,59 @@ public class LoginService {
StpUtil.login(userId);
return userId;
}
public UserFull loginWithSSO(String sessionData) throws LoginException {
String accessToken = "";
// 获取 ACCESS_TOKEN
ObjectMapper objectMapper = new ObjectMapper();
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://114.243.134.122:9217/passport/accessToken?grant_type=client_credentials")
.header("Authorization", "Basic TlNBRERAWlguT1JHOk14a1hHZ1ltOUNROUE3TCRSOCNLRW02R1pSeEhwd1c2")
.post(okhttp3.internal.Util.EMPTY_REQUEST)
.build();
try {
Response response = client.newCall(request).execute();
String rsp = response.body().string();
try {
AccessTokenResponse atr = objectMapper.readValue(rsp, AccessTokenResponse.class);
accessToken = atr.getAccess_token();
} catch (Exception e) {
throw new LoginException("解析 ACCESS_TOKEN 失败");
}
} catch (Exception e) {
e.printStackTrace();
throw new LoginException("获取 ACCESS_TOKEN 失败,网络请求错误");
}
if (Strings.isBlank(accessToken)) {
throw new LoginException("获取 ACCESS_TOKEN 失败");
}
// 校验 SESSION_DATA
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("sessionData", sessionData).build();
request = new Request.Builder()
.url("http://114.243.134.122:9217/passport/accessApplication")
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/x-www-form-urlencoded")
.post(body)
.build();
try {
Response response = client.newCall(request).execute();
String rsp = response.body().string();
// System.out.println("user: " + rsp);
if (StringUtils.isBlank(rsp)) {
throw new LoginException("解析用户数据为空");
}
try {
UserFull userFull = objectMapper.readValue(rsp, UserFull.class);
return userFull;
} catch (Exception e) {
e.printStackTrace();
throw new LoginException("解析 ACCESS_TOKEN 失败");
}
} catch (Exception e) {
e.printStackTrace();
throw new LoginException("校验 SESSION_DATA 失败");
}
}
}