Files
ERP/oa-backend/src/main/java/com/kaidi/oa/web/AuthController.java
T
Qiufeng d3892320dd
Signed Release / release (push) Successful in 9m24s
feat: add managed online updates
2026-08-04 20:05:50 +08:00

77 lines
2.8 KiB
Java

package com.kaidi.oa.web;
import com.kaidi.oa.common.ApiException;
import com.kaidi.oa.common.ApiResp;
import com.kaidi.oa.domain.SysUser;
import com.kaidi.oa.service.AuthService;
import com.kaidi.oa.service.AuthorizationService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
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.RestController;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeSet;
/**
* Authentication endpoints. Issues an opaque token on login; the frontend sends
* it back as a Bearer token. Session lookup and logout supported.
*/
@RestController
@RequestMapping("/api/oa/auth")
public class AuthController {
private final AuthService authService;
private final CurrentUserResolver currentUser;
private final AuthorizationService authorizationService;
public AuthController(AuthService authService, CurrentUserResolver currentUser,
AuthorizationService authorizationService) {
this.authService = authService;
this.currentUser = currentUser;
this.authorizationService = authorizationService;
}
public record LoginRequest(@NotBlank String loginName, @NotBlank String password) {
}
@PostMapping("/login")
public ApiResp<Map<String, Object>> login(@RequestBody LoginRequest req) {
AuthService.LoginResult result = authService.login(req.loginName(), req.password());
return ApiResp.ok(toSession(result.user(), result.token()));
}
@GetMapping("/session")
public ApiResp<Map<String, Object>> session(HttpServletRequest request) {
String token = currentUser.extractToken(request);
SysUser user = authService.resolve(token);
if (user == null) {
throw new ApiException(401, "未登录或会话已过期");
}
return ApiResp.ok(toSession(user, token));
}
@PostMapping("/logout")
public ApiResp<Void> logout(HttpServletRequest request) {
authService.logout(currentUser.extractToken(request));
return ApiResp.ok();
}
private Map<String, Object> toSession(SysUser user, String token) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("token", token);
map.put("id", user.getId());
map.put("loginName", user.getLoginName());
map.put("displayName", user.getDisplayName());
map.put("deptId", user.getDeptId());
map.put("title", user.getTitle());
map.put("email", user.getEmail());
map.put("roles", new TreeSet<>(authorizationService.roleCodesOf(user.getId())));
return map;
}
}