我的应用程序有一个api服务器(springboot)和一个面向客户机的服务器(react),react服务器将代表经过身份验证的用户发出api请求。对于身份验证,我使用第三方提供的cas服务器。
我使用了java apereo cas客户端(版本3.6.2),并为react应用程序添加了以下api端点以调用:
@RestController
public class CASController {
@Value("${cas.server-url-prefix}")
private String CASUrl;
@GetMapping("/login")
public String getCASUserId(HttpServletRequest request){
return request.getRemoteUser();
}
@GetMapping("/logout")
public void logout(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession(false);
if(session != null || !request.isRequestedSessionIdValid()) {
String id = session.getId();
session.invalidate();
log.info("JSESSIONID: " + id + " is valid: " + request.isRequestedSessionIdValid());
}
try{
response.sendRedirect(CASUrl + "/logout");
}
catch (IOException | IllegalStateException e){
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, e.getLocalizedMessage());
}
}
}
如果springboot应用程序直接与客户机交互,那么上面的端点就可以工作,但是它不能,它接受来自react服务器的请求。当react应用程序尝试调用时: localhost:8080/login
,由于重定向而失败。
解决这个问题的一种方法是从react应用程序调用cas服务器,然后将所需的信息(服务url和cas服务器发出的票证)发送到后端,如果票证验证成功,让后端进行票证验证调用,然后对用户进行身份验证,并将会话id发送回react应用程序,以供后续请求使用。
我的问题是:
解决方法有意义吗?身份验证在前端(从cas服务器获取票证)和后端(使用cas服务器验证已颁发的票证并发出会话)之间进行。如果没有,有什么更好的解决办法?
为了解决这个问题,我想我需要使用Spring Security ,而不是javaapereo-cas-client?如果是这样,我该怎么做?
我试过这样的方法:
票证验证终结点:
@GetMapping("/login")
public String getCASUserId(@RequestParam @NotBlank String URL,
@RequestParam @NotBlank String ticket,
HttpServletRequest request){
// make the call the the CAS server for ticket validation
String userId = userService.getUserId(url, ticket);
HttpSession session = request.getSession();
session.setAttribute("userId", userId);
return userId;
}
验证票证,发出会话,但实际上没有保护端点,因为既没有启用spring security,也没有启用javaapereo cas客户端。
暂无答案!
目前还没有任何答案,快来回答吧!