2017-07-28 6 views
0

フィルタの認証に使用するユーザオブジェクトをリソースに渡したいとします。出来ますか?Jax-RS Filterオブジェクトをリソースに渡す

私はこれを行うには見ることができる2つの方法がありますwildfly 10(RESTEasyの3)

@Secured 
@Provider 
@Priority(Priorities.AUTHENTICATION) 
public class AuthenticationFilter implements ContainerRequestFilter { 

    @Inject 
    private UserDao userDao; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 

    logger.warn("Filter"); 
    String uid = requestContext.getHeaderString("Authorization"); 
    User user; 
    if((user = validateUser(uid)) == null) { 
     requestContext.abortWith(
       Response.status(Response.Status.UNAUTHORIZED).build()); 
    } 
    } 

    private User validateUser(String uid) { 
    return userDao.getById(uid); 
    } 
} 

答えて

1

を使用しています。最初の方がおそらくより標準的な方法ですが、より多くのコードです。最終的には、ユーザーをリクエストの一部として注入します。ただし、このソリューションに必要なのは、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は、あなたがそれを使用しなくてもそこにあります。

関連する問題