Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@RolesAllowed使用RESTEasy和Jackson筛选实体属性_Java_Jackson_Resteasy - Fatal编程技术网

Java 使用@RolesAllowed使用RESTEasy和Jackson筛选实体属性

Java 使用@RolesAllowed使用RESTEasy和Jackson筛选实体属性,java,jackson,resteasy,Java,Jackson,Resteasy,使用RESTEasy和Jackson,是否可以在我的模型中使用@RolesAllowed注释,以避免在输出中序列化某些属性,具体取决于用户的角色 我已经找到了大量关于如何使用Jersey实现这一点的文档,但是没有找到RESTEasy 我在这个体系结构上遇到了障碍,因此切换库不是一个选项,使用自定义的ObjectMapper也不是一个选项,因为模型太大了,需要花费大量时间来标记大型数据集的每个属性以进行正确的序列化。另外,这是指一个旧版本的杰克逊图书馆,我不知道如何使它与新版本的工作 编辑 具体地

使用RESTEasy和Jackson,是否可以在我的模型中使用
@RolesAllowed
注释,以避免在输出中序列化某些属性,具体取决于用户的角色

我已经找到了大量关于如何使用Jersey实现这一点的文档,但是没有找到RESTEasy

我在这个体系结构上遇到了障碍,因此切换库不是一个选项,使用自定义的
ObjectMapper
也不是一个选项,因为模型太大了,需要花费大量时间来标记大型数据集的每个属性以进行正确的序列化。另外,这是指一个旧版本的杰克逊图书馆,我不知道如何使它与新版本的工作

编辑


具体地看,以了解我正在努力实现的目标。请注意,这是Jersey特有的,到目前为止,我没有发现关于RESSTAY的文件来完成这一点。

< P>如果你不愿意使用,你可以考虑。首先需要根据用户角色扩展和控制序列化:

公共类RoleBasedPropertyFilter扩展了SimpleBanPropertyFilter{
私有字符串允许角色;
public RoleBasedPropertyFilter(字符串允许角色){
this.allowedRole=allowedRole;
}
@凌驾
公共字段(对象pojo、JsonGenerator jgen、,
序列化提供程序提供程序,
PropertyWriter(写入程序)引发异常{
PermitAll PermitAll=writer.getAnnotation(PermitAll.class);
if(permitAll!=null){
serializeAsField(pojo、jgen、提供者、编写器);
返回;
}
DenyAll-DenyAll=writer.getAnnotation(DenyAll.class);
if(denyAll!=null){
writer.MittedField(pojo、jgen、提供者);
返回;
}
RolesAllowed RolesAllowed=writer.getAnnotation(RolesAllowed.class);
如果(角色允许!=null){
如果(!Arrays.asList(rolesAllowed.value()).contains(allowedRole)){
writer.MittedField(pojo、jgen、提供者);
返回;
}
}
//如果未提供注释,则将序列化该属性
writer.serializeAsField(pojo、jgen、provider);
}
}
要将筛选器应用于某个bean,请使用
@JsonFilter(“roleBasedPropertyFilter”)
对其进行注释:

@JsonFilter(“roleBasedPropertyFilter”)
公共类用户{
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
私有字符串密码;
公共字符串getFirstName(){
返回名字;
}
公共字符串getLastName(){
返回姓氏;
}
@允许的角色({“ADMIN”})
公共字符串getEmail(){
回复邮件;
}
@丹亚尔
公共字符串getPassword(){
返回密码;
}
//其他的接球手和二传手
}
然后在中注册您的筛选器,用于:

String currentUserRole=//从当前用户获取角色
FilterProvider FilterProvider=新的SimpleFilterProvider()
.addFilter(“roleBasedPropertyFilter”,
新RoleBasePropertyFilter(currentUserRole));
ObjectMapper mapper=新的ObjectMapper();
映射器.setFilterProvider(filterProvider);

如果您想使过滤器成为“全局的”,也就是说,应用于所有bean,您可以在类中创建一个mix,并用
@JsonFilter(“roleBasedPropertyFilter”)
对其进行注释:

@JsonFilter(“roleBasedPropertyFilter”)
公共类RoleBasePropertyFiltermixin{
}
然后将mix-in类绑定到
对象

mapper.addMixIn(Object.class,RoleBasedPropertyFilterMixIn.class);

有针对性的解决方案应适用于最新版本的Jackson和RESTEasy。您提到:模型太大了,以至于标记大型数据集的每个属性以进行正确的序列化非常耗时,那么,您将应用哪些标准来过滤属性呢?解决方案引用了长期以来一直不推荐和消失的方法
ObjectMapper::getSerializationConfig::setSerializationView
。我尝试了
withView
方法,该方法似乎相同,但没有结果。问题中提到的标准是,用户必须具有访问该字段的特定权限。例如,具有管理员权限的用户将能够访问它,否则无法访问。IMHO使代码更易于阅读和区分用例。我知道您希望执行特定于角色的序列化。我要问的是:如果您不想使用视图(注释每个bean的每个属性),您将使用哪些标准来选择要序列化的属性?我想到的一个选项是按名称过滤属性(例如,使用
SimpleBeanPropertyFilter
)。然后,在
ContextResolver
中,您可以设置一个过滤器,而不是设置一个视图。我明白您的意思,我特别要寻找的是一种使
@RolesAllowed
注释工作的方法:这样就可以使用正确的角色对getProperty()方法进行注释,EJB容器将不允许调用该方法,因此,删除属性,如这里所述(注意,这适用于Jersey,而不是RESTEasy)。我在寻找等效的解决方案。我希望我已经说得更清楚了,为我刚才的误解感到抱歉,我只是在实施它,准确无误,谢谢:)