【发布时间】:2019-02-22 12:47:17
【问题描述】:
短版
javax.servlet.ServletRequest 的方法setAttribute(<key>, <Object>) 是不是只用作Java 代码中方法之间传递对象的一种手段?
加长版
假设我有一个 javax.servlet.Filter 实现来使用 cookie 处理所有登录用户的身份验证:
在 Spring Boot 中
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
Cookie[] cookies = null;
if (request instanceof HttpServletRequest) {
cookies = ((HttpServletRequest) request).getCookies();
}
Optional<User> user = mySessionAuthMethod(cookies);
if (user.isPresent()) {
request.setAttribute("user", user.get());
}
chain.doFilter(request, response);
}
}
然后,我可以在所有 Web API 方法中避免手动身份验证,只需检查 user 属性。 @RestController 的方法示例:
@RequestMapping(value = "/profile")
@CrossOrigin(origins = {MyProperties.ORIGIN}, allowCredentials = "true")
public ResponseEntity getProfile(HttpServletRequest request, HttpServletResponse response) {
String user = request.getAttribute("user");
if (user != null) {
return myGetProfileResponse(user);
}
return myNotLoggedInResponse();
}
我的问题是:
-
这种形式的身份验证安全吗? 我的意思是,
ServletRequest中的属性是否仅在 Java 中添加和用于方法之间的通信,或者它们是否已经添加到请求中在到达服务器之前? -
这种使用
Filters 的身份验证方式是避免重复代码的好习惯吗?
补充说明
这样做的真正原因不仅仅是身份验证。我还有Filters,它需要处理每个请求并将对象传递给Controllers。我绝对想要的是,即使是知道系统实现的人也不能伪造这些对象和信息。
【问题讨论】:
标签: java spring spring-boot security servlets