blob: dcb02acbb0c9287947b7f2f2f16f0f36f7395e62 [file] [log] [blame]
[//]: # " Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved. "
[//]: # " "
[//]: # " This program and the accompanying materials are made available under the "
[//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at "
[//]: # " http://www.eclipse.org/org/documents/edl-v10.php. "
[//]: # " "
[//]: # " SPDX-License-Identifier: BSD-3-Clause "
Entity Data Filtering
=====================
### *Role-based Entity Filtering using security annotations*
This example demonstrates how to use entity filtering feature together
with security annotations (from `javax.annotation.security` package) and
how to apply them on domain classes as well as on JAX-RS resource
classes or JAX-RS resource methods.
In addition to domain classes and JAX-RS resources (with security
annotations applied) there is also one (pre-matching) container request
filter, `SecurityRequestFilter`. The filter sets security context for
each incoming request as if the request was invoked by a user in role
"manager".
The full description how Entity Data Filtering can be found in Jersey
User Guide, chapter [Entity Data
Filtering](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html).
Sections relevant to this example (describing this exact example) are:
- [Enabling and configuring Entity Filtering in your
application](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html#d0e14229)
- [Role-based Entity Filtering using (javax.annotation.security)
annotations](https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/entity-filtering.html#ef.security.annotations)
Contents
--------
The mapping of the URI path space is presented in the following table:
URI path | Resource class | HTTP methods | Notes
----------------------------------------- | ---------------------- | -------------- | ----------------------------------------------------------------------------------------------
**_/restricted-resource/denyAll_** | RestrictedResource | GET | `@DenyAll` - returns HTTP 403, Forbidden response
**_/restricted-resource/permitAll_** | RestrictedResource | GET | `@PermitAll` - Role-based view on RestrictedEntity class - permitAll, simpleField
**_/restricted-resource/rolesAllowed_** | RestrictedResource | GET | `@RolesAllowed({"manager"})` - Role-based view on RestrictedEntity class - permitAll, simpleField, mixedField.managerField
**_/unrestricted-resource_** | UnrestrictedResource | GET | No security annotation used, user in role "manager" - Role-based view on RestrictedEntity class - permitAll, simpleField, mixedField.managerField
Application is based on Grizzly container (see `App`). Everything needed
(resources/providers) is registered in
`SecurityEntityFilteringApplication`.
Running the Example
-------------------
Run the example as follows:
> mvn clean package exec:java
This deploys current example using Grizzly. You can access the
application at:
- <http://localhost:8080/unrestricted-resource>
- <http://localhost:8080/restricted-resource/denyAll>
- <http://localhost:8080/restricted-resource/permitAll>
- <http://localhost:8080/restricted-resource/rolesAllowed>
- <http://localhost:8080/restricted-resource/runtimeRolesAllowed?roles=manager,user>
Using Jackson instead of MOXy
-----------------------------
This examples uses by default Entity Data Filtering feature together
with MOXy. To switch MOXy JSON provider to Jackson (2.x) JSON provider
simply
- comment registration of MOXy ContextResolver, and\
`register(new MoxyJsonConfig().setFormattedOutput(true).resolver())`
- uncomment registration of JacksonFeature\
`register(JacksonFeature.class)`
in `SecurityEntityFilteringApplication` class.