2016-09-04 4 views
0

Я создаю веб-сервис Джерси.Разница между HttpServletRequest и SecurityContext

Часть Docs Джерси:

Информационная безопасность запроса предоставляется путем введения JAX-RS SecurityContext экземпляра с помощью @Context аннотацию. Инъекционный экземпляр контекста безопасности предоставляет эквивалент функциональности, доступной в API HttpServletRequest.

При использовании HttpServletRequest я легко могу сделать что-то вроде этого:

private @Context HttpServletRequest req; 

@Path("/testing") 
@POST 
public Response testing() 
{ 
    HttpSession session = req.getSession(true); 
    session.setAttribute("username", "myusername"); 
    return Response.noContent().build(); 
} 

При использовании SecurityContext, я не уверен, как получить сеанс и как сохранить данные в нем, как я сделал в метод выше.

И в целом, когда следует использовать один над другим?

ответ

1

Вы не можете получить объект Session с использованием SecurityContext. Интерфейс SecurityContext имеет дело только с безопасностью, тогда как HttpServletRequest предоставляет всю информацию о конкретном запросе http (s), включая безопасность.

Хотя вы можете использовать объект Session для реализации безопасности, таким образом вы не используете какой-либо контейнер сервлетов, встроенный в функции безопасности.

Оба SecurityContext и HttpServletRequest есть метод

boolean isUserInRole(String role) 

, который может быть использован для получения роли вошедшего в систему пользователя и сделать соответствующие действия на сервере (например, вернуть другой ресурс, основанный на роли)

вы можете определить роли в web.xml (в случае, когда вы не используете SecurityContext)

<security-constraint> 
     <web-resource-collection> 
        <url-pattern>/rest/admin/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
        <role-name>admin</role-name> 
     </auth-constraint> 
     </security-constraint> 
     <security-constraint> 
      <web-resource-collection> 
        <url-pattern>/rest/orders/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
        <role-name>customer</role-name> 
     </auth-constraint> 
     </security-constraint> 
     <login-config> 
     <auth-method>BASIC</auth-method> 
     <realm-name>my-default-realm</realm-name> 
     </login-config> 

Однако при использовании SECUR ityContext вы можете sublass ResourceConfig и использовать аннотации для добавления ролей пользователей (https://jersey.java.net/documentation/latest/security.html)

@Path("/") 
@PermitAll 
public class Resource { 
@RolesAllowed("user") 
@GET 
public String get() { return "GET"; } 

@RolesAllowed("admin") 
@POST 
public String post(String content) { return content; } 

Теперь, даже если вы явно не называйте SecurityContext.isUserInRole (роль), Джерси будет делать эту проверку внутри. Один полный пример использования SecurityContext можно найти здесь https://simplapi.wordpress.com/2015/09/19/jersey-jax-rs-securitycontext-in-action/

Что касается того, когда использовать один над другим, используйте SecurityContext в Джерси (это проще и гибче, используя только аннотации).

+0

Где находится файл web.xml? У меня его нет. Получил только pom.xml файла Maven, Hibernate или Config.yml of Jersey. –

+0

Он должен быть в папке WEB-INF. Тем не менее, если вы используете SecurityContext, вам не нужно добавлять информацию, связанную с безопасностью, в ваш web.xml. –

+0

Возможно, у вас нет web.xml (новые спецификации сервлета не требуют его, поскольку все можно настроить с помощью аннотаций) –