【发布时间】:2017-08-08 07:03:05
【问题描述】:
我需要一个在每个 servlet 之前调用的过滤器,并检查该 servlet 是否有说明它需要身份验证的注释,例如 Servlet 3 中的 @ServletSecurity(@HttpConstraint(rolesAllowed={"user"}))。如果不是这种情况,则过滤器将返回。如果 servlet 需要身份验证,它将检查请求令牌是否具有 user 角色,如果没有,它将自动设置一个 NOT_AUTHENTICATED 响应,甚至不通过 servlet。
这项工作必须由过滤器完成,因为我需要验证请求中的 JWT 令牌并将解码的 JWT 添加到请求中,以便 servlet 可以使用它的有效负载。
如何检查过滤器中的 servlet 注释?在这种情况下,我可以在 servlet 中创建一个更简单的注释,例如 @RequiresAuth 吗?因为我不需要这个项目中的角色。
是否可以在不通过 servlet 的情况下从过滤器向客户端返回未经身份验证的响应?
是否可以通过编程将过滤器设置为第一个?
这就是我使用 Jersey 解决它的方法,但我需要一个仅使用 servlet 的解决方案:
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext context) {
final Method method = resourceInfo.getResourceMethod();
if (method.isAnnotationPresent(PermitAll.class)) return;
if (method.isAnnotationPresent(DenyAll.class)) {
context.abortWith(Response.status(Response.Status.FORBIDDEN).build());
return;
}
final RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
if (rolesAnnotation == null) return;
}
}
【问题讨论】:
标签: java servlets jakarta-ee