2010-02-18 1 views
10

Ich muss eine einfache Jersey RESTful API in einem Tomcat 6.0.24 Container sichern. Ich würde gerne die Authentifizierung mit Basic Authentication mit der tomcat-users.xml Datei zu definieren, um die Benutzer und Rollen (das ist für jetzt, wie ich sagte, es ist klein).Jersey, Tomcat und Sicherheitsanmerkungen

für die Zulassung Nun, würde Ich mag Lage sein, die JSR 250 Anmerkungen wie @RolesAllowed zu verwenden, @PermitAll, @DenyAll usw.

Ich kann mich nicht für das Leben herauszufinden, wie diese alle zusammen bis verdrahten .

Ich möchte wirklich nicht die Spring Security Route gehen, da ich zum jetzigen Zeitpunkt etwas sehr einfaches brauche.

Kann mir jemand in die richtige Richtung zeigen?

+0

Da Sie diese Frage mit "Feder" und "Feder-Sicherheit" markiert haben, aber stattdessen angegeben haben, dass Sie sie nicht verwenden möchten, benutzen Sie eigentlich Feder? Wenn nicht, lass sie einfach weg. – BalusC

+0

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

Antwort

1

Sie können mit der Verwendung eines Filters beginnen, der zunächst die Authentifizierungs- und Rechteverwaltung abdeckt. mit der Implementierung von ResourceFilter und ContainerRequestFilter, Sie können httpRequest, Sitzungen leitet dann Ihre Anwendung/Anfragen zu verwandten Methoden.

Für die Rechteverwaltung können Sie den SecurityContext-Filter implementieren. Sie müssen zuerst die isUserInRole überprüfen, um die Methode instant zu lassen. Hier

ist die sasmple für Security Umsetzung:

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; 
    } 
} 

Hier ist die grundlegende secirtyCotnextFilter Umsetzung:

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; 
    } 


} 

nicht fotget Ihre Filter als init-param in der web.xml zu setzen ,

Dann können Sie Anfrage mit Ihrer Rolle-Privileg-Authentifizierungslogik behandeln.