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