1

我不熟悉基于应用程序服务器的安全约束。对于以下 web.xml 示例,我看到了定义的角色以及哪个角色可以访问受限资源。

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Whatever</realm-name>
</login-config> 

<security-role>
    <description>Administrator Role</description>
    <role-name>admin</role-name>
</security-role>

<security-role>
    <description>Privileged User</description>
    <role-name>privileged</role-name>
</security-role>

<security-role>
    <description>Guest User</description>
    <role-name>guest</role-name>
</security-role>


<security-constraint>
    <web-resource-collection>
        <web-resource-name>Privileged area</web-resource-name>
        <url-pattern>/restricted/*</url-pattern>
    </web-resource-collection>
    
    <auth-constraint>
        <role-name>admin</role-name>
        <role-name>privileged</role-name>
    </auth-constraint> 
</security-constraint>

当用户第一次发出 http 请求以访问受限页面时,他们没有角色并要求输入用户名/密码。容器可以根据数据库验证用户名并为用户分配角色(例如管理员)。容器将这个角色存储在哪里,以便对于后续的 http 请求,它知道该请求具有访问资源的适当角色?

4

1 回答 1

2

它存储在 Web 容器中的 HTTP Session 中。通常,客户端将在其对服务器的第一次请求时收到会话 ID(通常以 cookie 的形式,但并非必须如此) - 或者在其前一个会话过期后对服务器的第一次请求。然后,客户端将在后续请求中发送该会话 ID。客户端通过身份验证后,其安全上下文将存储在与会话 ID 关联的 HTTP 会话中。流程看起来像这样:

客户:您好,我想访问您的服务。

服务员:好的,你是谁?

客户:我是 Bob,这是我的密码。(发送凭据 - 不必是带有用户名/密码的基本身份验证)

服务员:嗨,鲍勃——这是您入住时的身份证。它会在 30 分钟不活动后过期。享受!(发送会话 ID)

客户:太好了,我想访问资源 XYZ。这是我的身份证。(发送会话 ID)

服务器:没问题 - 我们检查了注册表并确定您在有权访问 XYZ 的组中。享受!

于 2021-08-26T15:46:38.100 回答