使用RESTEasy和Jackson,是否可以@RolesAllowed
在模型中使用注释,从而避免根据用户的角色在输出中序列化某些属性?
我已经找到了大量关于如何使用Jersey的文档,但是关于RESTEasy却没有。
我在此架构上受阻,因此切换库不是一个选择,并且也不像此处ObjectMapper
说明的那样使用自定义,因为该模型足够大,以至于标记大型数据集的每个属性都太耗时用于正确的序列化。另外,这是指Jackson库的较旧版本,我不确定如何使其与新版本一起使用。
编辑
具体请参阅此博客文章,以了解我要完成的工作。请注意,这是特定于泽西岛的,到目前为止,我还没有找到有关RESTEasy的文档来完成此操作。
如果您不愿意使用@JsonView
,可以考虑@JsonFilter
。首先,您需要SimpleBeanPropertyFilter
根据用户角色扩展和控制序列化:
public class RoleBasedPropertyFilter extends SimpleBeanPropertyFilter {
private String allowedRole;
public RoleBasedPropertyFilter(String allowedRole) {
this.allowedRole = allowedRole;
}
@Override
public void serializeAsField(Object pojo, JsonGenerator jgen,
SerializerProvider provider,
PropertyWriter writer) throws Exception {
PermitAll permitAll = writer.getAnnotation(PermitAll.class);
if (permitAll != null) {
serializeAsField(pojo, jgen, provider, writer);
return;
}
DenyAll denyAll = writer.getAnnotation(DenyAll.class);
if (denyAll != null) {
writer.serializeAsOmittedField(pojo, jgen, provider);
return;
}
RolesAllowed rolesAllowed = writer.getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
if (!Arrays.asList(rolesAllowed.value()).contains(allowedRole)) {
writer.serializeAsOmittedField(pojo, jgen, provider);
return;
}
}
// If no annotation is provided, the property will be serialized
writer.serializeAsField(pojo, jgen, provider);
}
}
要将过滤器应用于某个bean,请使用进行注释@JsonFilter("roleBasedPropertyFilter")
:
@JsonFilter("roleBasedPropertyFilter")
public class User {
private String firstName;
private String lastName;
private String email;
private String password;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@RolesAllowed({"ADMIN"})
public String getEmail() {
return email;
}
@DenyAll
public String getPassword() {
return password;
}
// Other getters and setters
}
然后,注册您的过滤器在你的ContextResolver
了ObjectMapper
:
String currentUserRole = // Get role from the current user
FilterProvider filterProvider = new SimpleFilterProvider()
.addFilter("roleBasedPropertyFilter",
new RoleBasedPropertyFilter(currentUserRole));
ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider);
如果要将过滤器设置为“全局”,即要应用于所有bean,则可以创建一个混合类,并使用对其进行注释@JsonFilter("roleBasedPropertyFilter")
:
@JsonFilter("roleBasedPropertyFilter")
public class RoleBasedPropertyFilterMixIn {
}
然后将混合类绑定到Object
:
mapper.addMixIn(Object.class, RoleBasedPropertyFilterMixIn.class);
在 JAX-RS 应用程序中,必须根据已登录用户分配到的角色来筛选我的某些资源。我正在尝试使用安全注释(和)来实现此目的。 现在,每个人(匿名和登录用户)都可以并检索(每个id),但对于角色中的用户,我希望看到输出(此处序列化为JSON): 其他用户(无论是匿名用户还是非角色的其他用户)应该只看到: 我知道Jersey有实体过滤(以及基于安全角色进行过滤的实现)。 不幸的是,Liberty(基于A
问题内容: 是否可以通过多个值过滤对象数组? 例如,在下面的示例中,我可以按term_ids 5和6进行过滤,然后同时键入car吗? 如果可以轻松使用,肯定可以使用库。 问题答案: 您可以使用Array.filter
问题内容: 我在被注释的对象中建立一对多关系时遇到问题。 我有以下几点: 然后这个 和这个 我在这里做错了什么 问题答案: 该属性正在引用,而该属性是,因此出现错误消息。因此,请将您的映射更改为: 或者将实体属性更改为(这就是我要做的)。 mapledBy参考指示“在我有一个用于查找配置的集合的东西上查找名为’customer’的bean属性。”
我有一个名为的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示: 具有各自的吸气器和设置器。是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是或。 我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为的列表中。到目前为止,我的方法只是遍历列表,并返回与和匹配的第一个: 然而,这完全忽视了一个事
问题内容: 我正在尝试使用匹配其id属性的正则表达式过滤html表。我究竟做错了什么?我正在尝试实现的代码: 我得到的错误:preg_match期望第二个参数是一个字符串,给定数组。 问题答案: 根据DOM(具有命名空间等),属性仍然是一个复杂的元素。采用: 现在,我们需要一个布尔值返回,所以: 顺便说一句:对于更复杂的问题,您当然可以偷偷检查一下这是怎么回事: 很遗憾,我们没有可用的XPATH
我试图按照RESTeasy文档的建议,指定一个只与我的一些API调用相关联的预匹配过滤器。下面是我的代码: 名称绑定: 更新:在RESTeasy 3.0.1-Final中仍然遇到同样的问题。