我有一个JAX-
RS服务,我希望所有用户都可以访问我的服务,但只有那些有权查看结果的用户才能访问我的服务。基于角色的安全性以及现有的REALMS和不良处理方法不符合我的要求。
例如:
问题是:在某些单独的过滤器,安全性上下文或每种REST方法实现中,应在哪里检查用户ID?如何为REST方法提供此ID,按ID过滤请求后,可以在每个方法中注入securityContext吗?
我正在使用GlassFish 4.1和Jersey JAX-RS实现。
您可以在中执行此逻辑ContainerRequestFilter
。在这里处理自定义安全功能非常普遍。
要考虑的一些事情
该类应带有注释,@Priority(Priorities.AUTHENTICATION)
以便在其他过滤器(如果有)之前执行。
您应该SecurityContext
在过滤器中使用。我要做的是实现一个SecurityContext
。您可以根据需要真正实现它。
这是一个没有任何安全逻辑的简单示例
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecurityFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
SecurityContext originalContext = requestContext.getSecurityContext();
Set<String> roles = new HashSet<>();
roles.add("ADMIN");
Authorizer authorizer = new Authorizer(roles, "admin",
originalContext.isSecure());
requestContext.setSecurityContext(authorizer);
}
public static class Authorizer implements SecurityContext {
Set<String> roles;
String username;
boolean isSecure;
public Authorizer(Set<String> roles, final String username,
boolean isSecure) {
this.roles = roles;
this.username = username;
this.isSecure = isSecure;
}
@Override
public Principal getUserPrincipal() {
return new User(username);
}
@Override
public boolean isUserInRole(String role) {
return roles.contains(role);
}
@Override
public boolean isSecure() {
return isSecure;
}
@Override
public String getAuthenticationScheme() {
return "Your Scheme";
}
}
public static class User implements Principal {
String name;
public User(String name) {
this.name = name;
}
@Override
public String getName() { return name; }
}
}
注意事项
SecurityContext
isUserInRole
方法。这将用于授权。User
实现的自定义类java.security.Principal
。我返回了这个自定义对象SecurityContext
在ContainerRequestContext
怎么办?让我们看一个简单的资源类
@Path("secure")
public class SecuredResource {
@GET
@RolesAllowed({"ADMIN"})
public String getUsername(@Context SecurityContext securityContext) {
User user = (User)securityContext.getUserPrincipal();
return user.getName();
}
}
注意事项:
SecurityContext
被注入该方法。 Principal
并将其投射到User
。因此,实际上您可以创建任何实现的类Principal
,并根据需要使用此对象。@RolesAllowed
注释。对于Jersey,有一个过滤器SecurityContext.isUserInRole
通过传入@RolesAllowed
批注中的每个值来检查,以查看是否允许用户访问资源。要在Jersey启用此功能,我们需要注册 RolesAllowedDynamicFeature
@ApplicationPath("/api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("packages.to.scan");
register(RolesAllowedDynamicFeature.class);
}
}
问题内容: 我希望能够从请求中打印JAX-RS 2 JSON有效负载,而不管我的应用程序服务器上的实际实现如何。 我已经尝试过在SO上提出建议的解决方案,但是所有解决方案都包含实际实现中的二进制文件(例如Jersey和类似文件),并且只允许在我的应用程序中使用javaee- api v 7.0。 我尝试在我的客户端上实现ClientRequestFilter和ClientResponseFilte
我们正在使用JAX RS为我们的一个项目实现一个REST API。要求是用户将以JSON格式传入请求对象。 让我们假设我们有一个在命中APIendpoint时调用的方法 示例请求对象: { “firstName”:“Test”, “lastName”:“Name”, “sno”:“A123” } 吸气剂和setter 现在,如果用户尝试向上面给出的请求对象添加其他参数(例如:“age”)并调用ap
客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须设置为“token”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推
客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须被设置为“code”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推
问题内容: 我有很多方法的RESTEasy Web服务器。我想要实现logback来跟踪所有请求和响应,但是我不想添加到每个方法中。 也许有一种方法可以将请求和响应收集到一个地方并记录下来。也许像RESTEasy上的HTTP请求过程链上的过滤器一样。 问题答案: 您可以创建过滤器并将其轻松绑定到需要记录的端点,从而使端点保持精简并专注于业务逻辑。 定义名称绑定注释 要将过滤器绑定到REST端点,J