我正在我的RESTful Web服务中实现安全性,我正在考虑创建一个过滤器来检查Authorization标头是否有效,并且通过将令牌发送到第三方端点来完成此检查。如果令牌有效,则第三方端点必须向我发送一个响应,其中包含有关令牌到期,客户端ID,范围和其他内容的信息。那么,逻辑是这样的:
@Override
public void doFilter(
final ServletRequest request,
final ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
header = req.getHeader("Authorization");
EndpointResponse eResponse = Endpoint.validate(header);
if(eResponse.valid())){
chain.doFilter(...);
return eResponse; //or equivalent
}else{
HttpServletResponse res = HttpServletResponse(response);
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
...
}
}
然后,在DAO课程中,我将使用像这样的eResponse
public final class DAO{
public void checks(){
if(eResponse.scope() == "ADMIN"){
...
}else{
...
}
}
}
在过滤器进行验证后,有没有办法注入或返回一个对象?希望不使用spring或hibernate,因为我不能在我的工作中使用它们。
- 编辑 -
我访问DAO的方式就像这样
@Path("")
public class CertificationService {
@GET
@Produces(CertificationApplication.SUPPORTED_REPRESENTATIONS)
@Path(CertificationConstants.URL_PATH)
public Response getCertificationByUpId(String upId) throws CertificationException {
ResponseBuilder response;
try{
response = Response.ok(DAO.findCertificationByUPID(upId));
} catch (CertificationException e) {
response = handleException(e);
}
return response.build();
}
}
findCertificationByUPID方法必须调用我在上面声明的checks()方法。
答案 0 :(得分:1)
尝试使用setAttribute()
request.setAttribute("auth", eResponse);
然后您的控制器可以使用
抓取对象EndpointResponse eResponse = (EndpointResponse) request.getAttribute("auth");
并随意做任何事情(包括将其传递给DAO):
dao.checks(eResponse);
其中DAO
与上面的相似,但是
public void checks(EndpointResponse eResponse) { ... }
代替。
如果您希望将EndpointResponse保留在DAO之外,则可以执行
public void checks(String role) { ... }
或类似。