Java 如何使用SecureAnnotationsInterceptor(Apache CXF)保护多个端点?

Java 如何使用SecureAnnotationsInterceptor(Apache CXF)保护多个端点?,java,security,rest,cxf,jsr250,Java,Security,Rest,Cxf,Jsr250,我正在使用Apache CXF,我想使用SecureAnnotationsInterceptor使用@RolesAllowed注释来保护我的端点 据我所知,我必须通过将引用传递给setSecureObject方法来告诉拦截器要保护哪个对象 不幸的是,代码不是为处理bean列表而设计的 然后我想知道如何用这个拦截器保护多个端点 我是否必须创建我自己版本的这个拦截器来创建它的多个实例(每个端点一个以确保安全)或其他什么?我不知道您是否找到了答案。对我来说,我修改了这个拦截器的setSecureObj

我正在使用Apache CXF,我想使用
SecureAnnotationsInterceptor
使用
@RolesAllowed
注释来保护我的端点

据我所知,我必须通过将引用传递给
setSecureObject
方法来告诉拦截器要保护哪个对象

不幸的是,代码不是为处理bean列表而设计的

然后我想知道如何用这个拦截器保护多个端点


我是否必须创建我自己版本的这个拦截器来创建它的多个实例(每个端点一个以确保安全)或其他什么?

我不知道您是否找到了答案。对我来说,我修改了这个拦截器的
setSecureObject
方法如下:

public void setSecuredObjectsList(Object[] objects) {

    Map<String, String> rolesMap = new HashMap<String, String>();
    for (Object o:objects ) {
        setSecuredObject(o, rolesMap);
    }

    super.setMethodRolesMap(rolesMap);
}


public void setSecuredObject(Object object, Map<String, String> rolesMap) {
    Class<?> cls = ClassHelper.getRealClass(object);
    findRoles(cls, rolesMap);
    if (rolesMap.isEmpty()) {
        LOG.warning("The roles map is empty, the service object is not protected");
    } else if (LOG.isLoggable(Level.FINE)) {
        for (Map.Entry<String, String> entry : rolesMap.entrySet()) {
            LOG.fine("Method: " + entry.getKey() + ", roles: " + entry.getValue());
        }
    }
}
public void setSecureObjectsList(对象[]对象){
Map rolesMap=newhashmap();
用于(对象o:对象){
设置安全对象(o,角色映射);
}
super.setMethodRoleMap(RoleMap);
}
public void setSecureObject(对象对象、映射角色映射){
类cls=ClassHelper.getRealClass(对象);
findRoles(cls、RoleMap);
if(rolesMap.isEmpty()){
LOG.warning(“角色映射为空,服务对象不受保护”);
}else if(LOG.isLoggable(Level.FINE)){
对于(Map.Entry:rolesMap.entrySet()){
LOG.fine(“方法:“+entry.getKey()+”,角色:“+entry.getValue()”);
}
}
}

很抱歉,这是一个答案,因为我没有足够的代表对艾哈迈德·法加利的答案发表评论。在上面的实现中,我们遇到了一个问题,我们用@RolesAllowed注释了接口,但并不是所有端点都得到了保护。如果rolesMap为空,findRoles()将检查超类。在第一次运行时,这是正确的,但由于rolesMap被重新使用,其他服务将不受保护。我们通过将SetSecureObject方法更改为:

public void setSecuredObject(Object object, Map<String, String> rolesMap) {
    Class<?> cls = ClassHelper.getRealClass(object);
    Map<String, String> instanceRoleMap = new HashMap<>();
    findRoles(cls, instanceRoleMap);
    if (instanceRoleMap.isEmpty()) {
        LOG.warning("The roles map is empty, the service object is not protected");
    } else if (LOG.isLoggable(Level.FINE)) {
        for (Map.Entry<String, String> entry : instanceRoleMap.entrySet()) {
            LOG.fine("Method: " + entry.getKey() + ", roles: " + entry.getValue());
        }
    }
    rolesMap.putAll(instanceRoleMap);
}
public void setSecureObject(对象对象,映射角色映射){
类cls=ClassHelper.getRealClass(对象);
Map instanceRoleMap=新HashMap();
findRoles(cls、instanceRoleMap);
if(instanceRoleMap.isEmpty()){
LOG.warning(“角色映射为空,服务对象不受保护”);
}else if(LOG.isLoggable(Level.FINE)){
对于(Map.Entry:instanceRoleMap.entrySet()){
LOG.fine(“方法:“+entry.getKey()+”,角色:“+entry.getValue()”);
}
}
RoleMap.putAll(instanceRoleMap);
}