を使用しています。最初の方がおそらくより標準的な方法ですが、より多くのコードです。最終的には、ユーザーをリクエストの一部として注入します。ただし、このソリューションに必要なのは、Principalです。非常に簡単なものは次のようになります。
import java.security.Principal;
...
public class UserPrinicipal implements Prinicipal {
// most of your existing User class but needs to override getName()
}
次に、あなたのフィルターで:
@Path("/myservice")
public class MyService {
@Context
private SecurityContext securityContext;
@Path("/something")
@GET
public Response getSomething() {
User user = (User)securityContext.getUserPrincipal();
}
}
I:あなたは、あなたのような何かができるユーザーをするクラスで
...
User user;
if((user = validateUser(uid)) == null) {
requestContext.abortWith(
Response.status(Response.Status.UNAUTHORIZED).build());
}
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return user;
}
@Override
public boolean isUserInRole(String role) {
// whatever works here for your environment
}
@Override
public boolean isSecure() {
return containerRequestContext.getUriInfo().getAbsolutePath().toString().startsWith("https");
}
@Override
public String getAuthenticationScheme() {
// again, whatever works
}
});
この方法で実装してもうまく動作します。しかし、間違いなくもっと簡単な方法は、ちょうどセッションでユーザーを格納することです:
@Context
private HttpServletRequest request;
...
User user;
if((user = validateUser(uid)) == null) {
requestContext.abortWith(
Response.status(Response.Status.UNAUTHORIZED).build());
}
request.getSession().setAttribute("user", user);
次に、あなたのサービスで:
@Path("/myservice")
public class MyService {
@Context
private SecurityContext securityContext;
@Path("/something")
@GET
public Response getSomething(@Context HttpServletRequest request) {
User user = (User)request.getSession().getAttribute("user");
}
}
第二の方法の欠点は、あなたは、もはや実際にあるということではありませんあなたがどこかの州を保存しているので、ステートレスなサービス。しかし、HttpSessionは、あなたがそれを使用しなくてもそこにあります。