2010-02-18 10 views
10

Je dois sécuriser une API Jersey RESTful simple dans un conteneur Tomcat 6.0.24. Je voudrais conserver l'authentification avec l'authentification de base en utilisant le fichier tomcat-users.xml pour définir les utilisateurs et les rôles (c'est pour l'instant, comme je l'ai dit c'est petit).Annotations Jersey, Tomcat et Sécurité

Maintenant, pour l'autorisation, je voudrais pouvoir utiliser les annotations JSR 250 comme @RolesAllowed, @PermitAll, @DenyAll, etc.

Je ne peux pas pour la vie de me comprendre comment câbler ce tout ensemble . Je ne veux vraiment pas passer par Spring Security, car j'ai besoin de quelque chose de très simple à l'heure actuelle.

Quelqu'un peut-il me diriger dans la bonne direction?

+0

Puisque vous avez étiqueté cette question avec 'spring' et' spring-security' mais que vous avez déclaré que vous ne voulez pas l'utiliser, utilisez-vous réellement le ressort? Sinon, laissez-les. – BalusC

+0

http://stackoverflow.com/questions/16433315/can-i-use-rolesallowed-on-restful-resources-implemented-on-apache-cxf – JayTee

Répondre

1

Vous pouvez commencer par utiliser un filtre qui couvre d'abord l'authentification et la gestion des privilèges. avec implémenter ResourceFilter et ContainerRequestFilter, vous avez la possibilité d'obtenir httpRequest, sessions puis redirige votre application/demandes à des méthodes connexes.

Pour la gestion des privilèges, vous pouvez implémenter le filtre SecurityContext. vous devez d'abord vérifier isUserInRole pour laisser la requête entrer dans la méthode.

Voici le sasmple pour la mise en œuvre SecurityContext:

public class SecurityContextImpl implements SecurityContext { 

    private final SessionUser user; 

    public SecurityContextImpl(SessionUser user) { 
     this.user = user; 
    } 

    public Principal getUserPrincipal() { 
     return user; 
    } 

    public boolean isUserInRole(String role) { 

     if(user == null) { 
      throw new AuthenticationException(); 
     } 
     if(ObjectUtil.isNull(user.getPrivileges())){ 
      throw new AuthenticationException(); 
     } 
     if(!user.getPrivileges().contains(role)) { 
      throw new InvalidAuthorizationHeaderException(); 
     } 
     return user.getPrivileges().contains(role); 
    } 

    public boolean isSecure() { 
     return false; 
    } 

    public String getAuthenticationScheme() { 
     return SecurityContext.BASIC_AUTH; 
    } 
} 

Voici la mise en œuvre de secirtyCotnextFilter de base:

public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter { 

    private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class); 

    protected static final String HEADER_AUTHORIZATION = "Authorization"; 

    protected static final String HEADER_DATE = "x-java-rest-date"; 

    protected static final String HEADER_NONCE = "nonce"; 


    private HttpServletRequest httpRequest; 




    public SecurityContextFilter() { 


    } 


    public ContainerRequest filter(ContainerRequest request) { 

     SessionUser sessionUser = (SessionUser) httpRequest 
       .getSession() 
       .getAttribute("sessionUser"); 

     request.setSecurityContext(new SecurityContextImpl(sessionUser)); 

     return request; 
    } 


    public ContainerRequestFilter getRequestFilter() { 
     return this; 
    } 

    public ContainerResponseFilter getResponseFilter() { 
     return null; 
    } 

    public HttpServletRequest getHttpRequest() { 
     return httpRequest; 
    } 

    public void setHttpRequest(HttpServletRequest httpRequest) { 
     this.httpRequest = httpRequest; 
    } 


} 

Ne pas fotget de mettre votre filtre en init-param dans le web.xml Puis, vous pouvez gérer la requête avec votre logique role-privilege-authenticaiton.