2010-11-08 10 views
9

Busco algunos consejos sobre cómo proteger mi reposo raíz RecursosCómo hacer autenticación Resto con JAX-RS

@Path("/employee") 
public class EmployeeResource { 

    @GET 
    @Produces("text/html") 
    public String get(
     @QueryParam("name") String empname, 
     @QueryParam("sn") String sn) { 

     // Return a data back. 
    } 
} 

He leído el post de relación con authetication básica y OAuth, sé el concepto pero yo soy buscando formas de cómo implementarlo en el código.

Gracias

Respuesta

6

Declarar un interceptor:

<bean id="securityInterceptor" class="AuthenticatorInterceptor"> 
<property name="users"> 
    <map> 
<entry key="someuser" value="somepassword"/> 
    </map> 
</property> 

Entonces usarlo:

<jaxrs:server address="/"> 
     <jaxrs:inInterceptors> 
      <ref bean="securityInterceptor"/> 
     </jaxrs:inInterceptors> 
     (etc) 

Luego, su AuthenticationInterceptor, a lo largo de las líneas de :

import java.util.Map; 

import org.apache.cxf.message.Message; 
import org.apache.cxf.phase.PhaseInterceptor; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 
import org.apache.cxf.configuration.security.AuthorizationPolicy; 
import org.apache.cxf.interceptor.Interceptor; 

import org.springframework.beans.factory.annotation.Required; 

public class AuthenticatorInterceptor extends AbstractPhaseInterceptor<Message> { 

    private Map<String,String> users; 

    @Required 
    public void setUsers(Map<String, String> users) { 
     this.users = users; 
    } 

    public AuthenticatorInterceptor() { 
     super(Phase.RECEIVE); 
    } 

    public void handleMessage(Message message) { 

     AuthorizationPolicy policy = message.get(AuthorizationPolicy.class); 

    if (policy == null) { 
     System.out.println("User attempted to log in with no credentials"); 
     throw new RuntimeException("Denied"); 
     } 

    String expectedPassword = users.get(policy.getUserName()); 
    if (expectedPassword == null || !expectedPassword.equals(policy.getPassword())) { 
     throw new RuntimeException("Denied"); 
    } 
    } 

} 

La definición de credenciales aceptables de una manera más conveniente se deja como un ejercicio para el lector.

+0

oye gracias intentaré esto :) – BinCode

2

La manera en que sé es agregar web.xml de su aplicación web. Como mínimo, creo que es necesario agregar:

<!-- Specifies what and how to protect *part* of a webapp --> 
<security-constraint> 

    <!-- WHAT TO PROTECT --> 
    <web-resource-collection> 
     <web-resource-name>employee-related-urls</web-resource-name> 
     <!-- You might need to list other patterns too with more of these --> 
     <url-pattern>/employee/*</url-pattern> 
    </web-resource-collection> 

    <!-- WHO IS ALLOWED IN --> 
    <auth-constraint> 
     <!-- I assume something sensible here! --> 
     <role-name>employee</role-name> 
    </auth-constraint> 

    <!-- HOW TO PROTECT THE REQUESTS AND RESPONSES --> 
    <user-data-constraint> 
     <!-- Force HTTPS (or equivalent, in a formal sense) --> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

<!-- HOW TO WORK OUT WHO IS ASKING --> 
<login-config> 
    <!-- This is how to specify BASIC HTTP auth; look up docs for OAuth yourself --> 
    <auth-method>BASIC</auth-method> 
    <!-- Omit the next element to use the container's default --> 
    <realm-name>site</realm-name> 
</login-config> 
+0

Gracias Donal, lo investigaré. y regresa – BinCode

Cuestiones relacionadas