HttpServletRequest和SecurityContext之间的区别

时间:2016-09-04 06:37:16

标签: java jersey

我正在创建泽西岛网络服务。

泽西岛文档的一部分:

  

通过使用@Context注释注入JAX-RS SecurityContext实例,可以获得请求的安全信息。注入的安全上下文实例提供了HttpServletRequest API上可用功能的等效功能。

使用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 个答案:

答案 0 :(得分:1)

您无法使用SecurityContext检索Session对象。 SecurityContext接口仅处理安全性,而HttpServletRequest提供有关特定http(s)请求的所有信息,包括安全性。

虽然您可以使用Session对象来实现安全性,但这样您就不会使用安全功能中构建的任何servlet容器。

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>

但是,使用SecurityContext时,您可以对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(角色),Jersey也会在内部进行此检查。可以在此处找到使用SecurityContext的一个完整示例https://simplapi.wordpress.com/2015/09/19/jersey-jax-rs-securitycontext-in-action/

至于何时使用另一个,在Jersey中使用SecurityContext(仅使用注释更容易,更灵活)。