问题
How to make user object available for further processing in a Resource
@Priority(Priorities.AUTHENTICATION)
public static class ResourceAllowedRequestFilter implements ContainerRequestFilter {
private AuthorizationValidation authorizationValidation;
public ResourceAllowedRequestFilter() {
try {
authorizationValidation = new AuthorizationValidation();
} catch (Exception e) {
}
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (userHeader == null) {
throw new BadRequestException(Response.status(Status.BAD_REQUEST).build());
} else {
User user = authorizationValidation.isAuthorizationValid(userHeader)
}
}
}
@GET
@Path("/{page}/{limit}")
public Response getBooks() {
Access user object created in ContainerRequestFilter
}
回答1:
Afaig, there is only one way of doing so, named Injection - but multiple ways of using injection.
Here two approaches:
You can implement / use
javax.ws.rs.core.SecurityContext. Therefore your User must implementjava.security.Principaland use@Contextto inject the SecurityContext into your Resource. Basic example below ...You could also build and register a Factory and inject the User per-request into your Resource. Please visit jersey docs for that, or search @ stackoverflow. You will find a lot of examples.
SecurityContext (1) Example:
ContainerRequestFilter
@Override
public synchronized void filter(ContainerRequestContext request)
throws IOException {
final User user = authorizationValidation.isAuthorizationValid(userHeader)
// impl
request.setSecurityContext( new MySecurityContext(user) );
// or simple but not the best
request.setSecurityContext( new SecurityContext() {
@Override
public boolean isUserInRole(String role) {
return true; // check roles if you need ...
}
@Override
public boolean isSecure() {
return false; // check HTTPS
}
@Override
public Principal getUserPrincipal() {
return user; // return your user here - User must implement Principal
}
@Override
public String getAuthenticationScheme() {
return null; // ...
}
}
}
Resource
@Context
protected SecurityContext securityContext;
@GET
@Path("/{page}/{limit}")
public Response getBooks() {
User user = (User)securityContext.getUserPrincipal();
}
Have a nice day ...
来源:https://stackoverflow.com/questions/26599655/access-object-created-in-containerrequestfilter-in-resources