tutorial servicios seguridad restful librerias jax español cliente rest java-ee jersey jax-rs restful-authentication

rest - servicios - Cómo hacer la Autenticación de reposo con JAX-RS



restful java ee (2)

De la manera que sé es agregar a su webapp web.xml . Como mínimo, creo que debes 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>

Estoy buscando algunos consejos sobre cómo asegurar mi recurso raíz de descanso

@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 publicaciones relacionadas con la autenticación básica y OAuth, conozco el concepto pero estoy buscando formas de implementarlo en el código.

Gracias


Declara un interceptor:

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

Entonces úsalo:

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

Luego, su AuthenticationInterceptor, en la línea 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.