gpt4 book ai didi

java - HttpServletRequest 和 SecurityContext 之间的区别

转载 作者:行者123 更新时间:2023-11-30 07:10:24 26 4
gpt4 key购买 nike

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

Jersey 文档的一部分:

Security information of a request is available by injecting a JAX-RS SecurityContext instance using @Context annotation. The injected security context instance provides the equivalent of the functionality available on 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时,我不确定如何检索 session 以及如何在其中保存信息,就像我在上面的方法中所做的那样。

更一般地说,我什么时候应该使用其中一种而不是另一种?

最佳答案

您无法使用 SecurityContext 检索 Session 对象。 SecurityContext 接口(interface)仅处理安全性,而 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(role),Jersey 也会在内部执行此检查。可以在此处找到使用 SecurityContext 的完整示例 https://simplapi.wordpress.com/2015/09/19/jersey-jax-rs-securitycontext-in-action/

至于何时使用其中之一,请使用 Jersey 中的 SecurityContext(仅使用注释会更容易、更灵活)。

关于java - HttpServletRequest 和 SecurityContext 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com