Java 如何初始化特定于请求/上下文的对象

Java 如何初始化特定于请求/上下文的对象,java,web-services,cxf,Java,Web Services,Cxf,我有一个基于ApacheCXF和JAX-RS的webservice项目。我已经实现了基于角色的身份验证/授权。在进行身份验证时,如果用户已通过身份验证,我希望使用此对象(用户对象)在整个项目中用于访问日志记录或“谁做了什么”目的。 有没有办法做到这一点?这个对象也应该是基于请求的。因为每个请求都经过DB的身份验证 下面是示例代码 public class SecurityInterceptor implements RequestHandler { @Override public Resp

我有一个基于ApacheCXF和JAX-RS的webservice项目。我已经实现了基于角色的身份验证/授权。在进行身份验证时,如果用户已通过身份验证,我希望使用此对象(用户对象)在整个项目中用于访问日志记录或“谁做了什么”目的。 有没有办法做到这一点?这个对象也应该是基于请求的。因为每个请求都经过DB的身份验证

下面是示例代码

 public class SecurityInterceptor implements RequestHandler {

@Override
public Response handleRequest(Message message,  ClassResourceInfo classResourceInfo) {

    Response response = null;

    OperationResourceInfo operationResourceInfo = message.getExchange().get(OperationResourceInfo.class);
    Method methodToInvoke = operationResourceInfo.getMethodToInvoke();

    if ( methodToInvoke.isAnnotationPresent(AllowAll.class) ){//Allow all the request to pass. i.e. login,menu_item etc.
        response = null;
    } else if ( methodToInvoke.isAnnotationPresent(RolesAllowed.class) ){ // authenticate and authorize.

        Map<String, List<String> > valueMap = ((Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS));
        List<String> tokenList = valueMap.get(TOKEN_HEADER);

        //checking whether token list is empty.
        if ( tokenList == null || tokenList.isEmpty() ){
            response = Response.ok( prepareResponse(FAILURE , _00028 ) ).build(); 
        } else { //else authenticate request with token .
            String token = tokenList.get(0);

            AuthenticationBO authBo = new AuthenticationBOImpl();
            authBo.authenticate(token);
            if ( authBo.getResponse().getStatus() == SUCCESS ){

                Authentication auth = authBo.getResponse().getPbBeans().getAuthentication();

                //this user object needs to be set in Context to be used in service classes.
                final User contextUser = auth.getUser();

                Set<Integer> rolesSet = new HashSet<Integer>(  Arrays.asList( ArrayUtils.toObject(methodToInvoke.getAnnotation(RolesAllowed.class).value() ) ) );

                if ( !authorize( contextUser , rolesSet ) ){
                    response = Response.ok( prepareResponse(FAILURE , _00022 ) ).build() ;  
                } else {

                    authBo = new AuthenticationBOImpl();
                    authBo.updateLastAccessTime( token );
                    if ( authBo.getResponse().getStatus() == FAILURE ){
                        System.out.println(" AUTHENTICATION UPDATE FAILURE !!! ");
                    }
                }
            } else {
                response = Response.ok( prepareResponse(authBo.getResponse().getStatus() , authBo.getResponse().getCode())).build();
            }   
        }
    }
    return response;
}

private boolean authorize(User user , Set<Integer> rolesAllowed ){
    if ( rolesAllowed.contains( user.getUser_role_key() )  ){
        return true ;
    } else {
        return false;
    }
}

public PBResponse prepareResponse(Integer status, String code  ){

    PBResponse response = new PBResponse();
    response.setStatus(status);
    response.setCode(code);
    response.setMessage( CodeProperties.getInstance().getValue(code) );

    return response;
}
公共类SecurityInterceptor实现RequestHandler{
@凌驾
公共响应handleRequest(消息消息,ClassResourceInfo ClassResourceInfo){
响应=空;
OperationResourceInfo OperationResourceInfo=message.getExchange().get(OperationResourceInfo.class);
方法methodToInvoke=operationResourceInfo.getMethodToInvoke();
if(methodToInvoke.isAnnotationPresent(AllowAll.class)){//允许所有请求通过。例如登录、菜单项等。
响应=空;
}else if(methodToInvoke.isAnnotationPresent(RolesAllowed.class)){//身份验证和授权。
Map valueMap=((Map)message.get(message.PROTOCOL_头));
List tokenList=valueMap.get(TOKEN\u头);
//检查令牌列表是否为空。
if(tokenList==null | | tokenList.isEmpty()){
response=response.ok(prepareResponse(FAILURE,_00028)).build();
}else{//else使用令牌对请求进行身份验证。
String token=tokenList.get(0);
AuthenticationBO authBo=新的AuthenticationBOImpl();
身份验证(令牌);
if(authBo.getResponse().getStatus()==成功){
Authentication auth=authBo.getResponse().getpbeans().getAuthentication();
//需要在上下文中设置此用户对象,以便在服务类中使用。
最终用户contextUser=auth.getUser();
Set rolesSet=newhashset(Arrays.asList(ArrayUtils.toObject(methodToInvoke.getAnnotation(RolesAllowed.class.value())));
如果(!授权(上下文,角色集)){
response=response.ok(prepareResponse(FAILURE,_00022)).build();
}否则{
authBo=newauthenticationboimpl();
authBo.updateLastAccessTime(令牌);
if(authBo.getResponse().getStatus()==失败){
System.out.println(“身份验证更新失败!!!”;
}
}
}否则{
response=response.ok(prepareResponse(authBo.getResponse().getStatus(),authBo.getResponse().getCode()).build();
}   
}
}
返回响应;
}
私有布尔授权(允许用户、设置角色){
if(rolesAllowed.contains(user.getUser\u role\u key())){
返回true;
}否则{
返回false;
}
}
公共PBResponse prepareResponse(整数状态,字符串代码){
PBResponse=新的PBResponse();
响应。设置状态(状态);
响应。设置代码(代码);
setMessage(CodeProperties.getInstance().getValue(code));
返回响应;
}

}

“我已经实现了基于角色的身份验证/授权”如何实现?向我们展示代码。使用基本身份验证,我在CXF中实现了拦截器,从那里我使用DB通过使用Base 64解码来验证用户。请向我们展示您的代码。