Protegendo Recursos JAX-RS Usando Anotações

É possível proteger Java™ API para recursos de Serviços da Web RESTful (JAX-RS) usando anotações que especificam configurações de segurança.

Antes de Iniciar

Essa tarefa assume que você desenvolveu o aplicativo e identificou os recursos JAX-RS que deseja proteger usando anotações para segurança.

Sobre Esta Tarefa

É possível proteger recursos JAX-RS usando anotações para segurança suportada por JSR 250. É possível usar as seguintes anotações para incluir semântica de autorização nos seus recursos de aplicativo JAX-RS:
  • @PermitAll - especifica que toda as funções de segurança têm permissão para acessar os seus recursos JAX-RS
  • @DenyAll - especifica que nenhuma função de segurança têm permissão para acessar os seus recursos JAX-RS
  • @RolesAllowed - especifica que as funções de segurança que têm permissão para acessar os seus recursos JAX-RS

É possível escolher anotar no nível de classe ou no nível de método. As seguintes regras determinam as anotações para segurança:

As anotações de nível de método têm precedência sobre anotações no nível de classe.
No seguinte fragmento de código, o recurso JAX-RS que é referenciado pela anotação @GET e @Path de /addresses e do método correspondente getList() não é restrito e aberto para consumo público. Porém, o recurso referenciado pelas anotações @PUT e @Path dos /addresses e o método updateList() correspondente necessitam da função de Manager; por exemplo:
@Path(value="/addresses")
        @PermitAll
        public class AddressBookResource {

          @GET
          @Produces(value="text/plain")
          public String getList() {
          }

          @PUT
          @RolesAllowed(“Manager”)
          to public void updateList(String[] books) {
          }
        }
As anotações para segurança são mutuamente exclusivas.
Isso significa que cada recurso só é controlado por no máximo uma das anotações para segurança. Por exemplo, o seguinte exemplo não é válido porque ambos, @PermitAll e @RolesAllowed, são especificados:
       @Path(value="/addresses")
       @PermitAll
       @RolesAllowed(“Employee”)
       public class AddressBookResource {

      @GET
      @Produces(value="text/plain")
      public String getList() {
      }
    }

No exemplo de código anterior, a anotação @RolesAllowed tem precedência e a anotação @PermitAll é ignorada. Da mesma forma, se a anotação @RolesAllowed e a anotação @DenyAll são ambas especificadas, a anotação @DenyAll tem precedência.

Da mesma forma, se as anotações @PermitAll e @DenyAll são ambas especificadas no método ou no nível de classe, a anotação @DenyAll tem precedência e garante segurança estando em conformidade com o princípio padrão de segurança.

Se as anotações @PermitAll, @DenyAll e @RolesAllowed estão todas presentes no método ou nível de classe, a anotação @DenyAll tem precedência sobre @RolesAllowed e @PermitAll. A ordem de precedência dessas anotações é a seguinte:
  1. @DenyAll
  2. @RolesAllowed
  3. @PermitAll

Regra para herança
Anotações JSR 250 que são incluídas no nível de classe apenas afetam as classes que elas anotam e os métodos correspondentes para subrecursos. Anotações que são especificadas no nível de classe não afetam recursos que são herdados de uma superclasse.
Regra para substituir método(s)
Anotações em recursos que correspondem a métodos substituídos em subclasses têm precedência sobre anotações que são incluídas na classe-pai. No seguinte fragmento, a função LocalAdministrator é usada para acessar o subrecurso /addresses/local; por exemplo:
       s@Path(value="/addresses")
       @PermitAll
       public class AddressBookResource {

          @GET
          @Produces(value="text/plain")
          public String getList() {
          } 

          @PUT
          @RolesAllowed(“Administrator”)
          public void updateList(String books) {
          
          }
        }

        @Path(value="/addresses")
        @PermitAll
        public class  LocalAddressBookResource 
                      extends AddressBookResource {
         
          @PUT
          @RolesAllowed(“LocalAdministrator”)
          @Path(value=”local”)  
          public void updateList(String books){  
          
          }
        }
Consideração de @RolesAllowed
Não é possível ter diversas anotações @RolesAllowed simultaneamente em um recurso. Por exemplo, é possível atingir:
  @RolesAllowed("role1")
   @RolesAllowed("role2")
    public String foo() {
    }
usando o seguinte fragmento de código:
 @RolesAllowed({"role1", "role2"})
  public String foo() {
   }
Considerações para o uso de anotações para segurança e a configuração de restrições de segurança

Anotações para segurança seguem o modelo de segurança declarativa. Restrições de segurança que são configuradas no descritor de implementação, o arquivo web.xml, têm precedência sobre restrições de segurança que são anotadas programaticamente no aplicativo. É importante para os desenvolvedores de recursos JAX-RS considerar um equilíbrio entre restrições de segurança configuráveis e restrições de segurança anotadas. Restrições anotadas são adicionais a quaisquer restrições de segurança configuradas. O ambiente de tempo de execução JAX-RS verifica restrições anotadas após o ambiente de tempo de execução do contêiner da Web ter verificado as restrições de segurança que estão configuradas no arquivo web.xml.

Configure restrições de autenticação no arquivo web.xml. No arquivo web.xml de exemplo a seguir, a restrição de segurança SecurityConstraint_1 está definida. Essa restrição é usada para requerer autenticação para o aplicativo. Além disso, a restrição de segurança SecurityConstraint_1 define restrições em padrões de URL correspondentes aos recursos JAX-RS. Quando um recurso JAX-RS é acessado que corresponde a uma dessas restrições, verificações de autorização são executadas. Verificações de acesso são executadas para as anotações de segurança declarativa apenas após as restrições configuradas serem verificadas.
<web-app id="WebApp_someID">
<servlet>
  <servlet-name>AddressBookAppSample</servlet-name>
  <servlet-class>
       org.apache.wink.server.internal.servlet.RestServlet
  </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>jaxrs.sample.AddressBookApplication
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>
    <servlet-mapping>
        <servlet-name>AddressBookApp</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <security-constraint id="SecurityConstraint_1">
      <web-resource-collection id="WebResourceCollection_1">
        <web-resource-name>AddressBookAppSample</web-resource-name>
        <description>Protection area for Rest Servlet</description>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method> 
      </web-resource-collection>
      <auth-constraint id="AuthConstraint_1">
         <description>Role1 for this rest servlet</description>
         <role-name>Role</role-name>
      </auth-constraint> 
      <user-data-constraint id="UserDataConstraint_1">
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>
    </security-constraint>
    <security-role id="SecurityRole_1">
         <description>Essa Função é usada para direcionar autenticação
         </description>
         <role-name>Role1</role-name>
    </security-role>  
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>test realm</realm-name>
 </login-config>
    </login-config>
</web-app>

No arquivo web.xml de amostra anterior, Role1 é usado para o aplicativo inteiro. Se você estiver apenas definindo anotações de segurança declarativa e não estiver usando restrições de autorização do arquivo web.xml, é possível mapear essa função para o aplicativo JAX-RS para o assunto especial AllAuthenticated para autenticação de usuário.

Procedimento

  1. Determine se existem restrições de segurança definidas pelo arquivo web.xml para o seu aplicativo JAX-RS.
  2. Configure o arquivo web.xml para incluir restrições de segurança. Restrições de segurança que são configuradas no descritor de implementação, o arquivo web.xml, têm precedência sobre restrições de segurança que são anotadas programaticamente no aplicativo.
  3. Determine se deseja incluir anotações para segurança, além de quaisquer restrições no arquivo web.xml. Decida de deseja incluir uma das anotações @PermitAll, @DenyAll e @RolesAllowed para fornecer segurança adicional para os seus recursos JAX-RS. Considere as regras para incluir anotações para segurança como a precedência e herança descritos previamente.

Resultados

Você definiu recursos JAX-RS seguros usando anotações de segurança declarativas.

Exemplo

O seguinte fragmento de código demonstra como é possível usar anotações de segurança para proteger recursos JAX-RS. Nesse exemplo, o recurso raiz /addresses está associado com uma anotação @PermitAll e, portanto, o subrecurso que corresponde aos métodos @GET e @Produces(value="text/plain") é permitido para todos os usuários porque esse recurso não introduz anotações de segurança próprias. Porém, o subrecurso que corresponde ao método @PUT está associado com sua própria anotação @RolesAllowed e requer a função Administrator.
@Path(value="/addresses")
 @PermitAll
 public class AddressBookResource {

   @GET
   @Produces(value="text/plain")
       public String getList() {
       } 

       
       @RolesAllowed(“Administrator”)
       @PUT
       public void updateList(String books) {
          
       }
    }

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_impl_securejaxrs_annotations
Nome do arquivo: twbs_jaxrs_impl_securejaxrs_annotations.html