首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

servlet3.1轨范翻译:第13章 安全

2013-02-25 
servlet3.1规范翻译:第13章 安全第13章 安全应用开发人员创建Web应用,他把应用给、销售,或转让给部署人员安

servlet3.1规范翻译:第13章 安全
第13章 安全

应用开发人员创建Web应用,他把应用给、销售,或转让给部署人员安装到运行时环境中。应用开发人员与部署人员沟通部署系统以及安全需求。该信息可以通过应用部署描述符声明传达,或者在应用代码中使用注解来传达。

本质描述了Servlet容器安全机制、接口、部署描述符和基于注解机制传达应用安全需求。

13.1 介绍

web应用包含的资源可以被多个用户访问。这些资源常常在开放网络如Internet上不受保护的遍历。在这样的环境中,大量的web应用将有安全需求。

尽管质量保障和实现细节可能会有所不同,但servlet容器有满足这些需求的机制和基础设施,共用如下一些特性:

身份认证:表示通信实体之间以代表特定身份彼此证明进行授权访问。

资源访问控制:表示用户或程序与资源交互是受限制的,以达到强制完整性、保密性、或可用性约束的目的。

数据完整性:表示用来证明信息在传输过程中没有被第三方修改。

保密性或数据隐私:表示用来保证信息只对已授权访问的用户访问。

13.2 声明式安全

声明式安全是指以在应用外部的形式表达应用的安全模型需求,包括角色、访问控制和认证需求。部署描述符是web应用中声明式安全的主要手段。

部署人员映射应用的逻辑安全需求到特定于运行时环境代表性的安全策略。在运行时,servlet容器使用安全策略表示来实施认证和授权。

安全模型适用于web应用的静态内容部分和客户端请求到的应用内的servlet和过滤器。安全模型不适用于当servlet使用RequestDispatcher调用静态内容或使用forward或include到的servlet。

13.3 编程式安全

当单独使用声明式安全是不足以表达应用的安全模型时,编程式安全被用于安全意识的应用。编程式安全包括以下HttpServletRequest接口的方法:

■ authenticate

■ login

■ logout

■ getRemoteUser

■ isUserInRole

■ getUserPrincipal

login方法允许应用执行用户名和密码收集(作为一种Form-Based Login的替代)。authenticate方法允许一个应用由容器从不受约束的请求上下文内部让请求调用者认证。

logout方法提供用于应用重置来访者的请求身份。

getRemoteUser方法由容器返回与该请求相关的远程用户(即来访者)的名字。

isUserInRole方法确定与该请求相关的远程用户(即来访者)是否在一个特定的安全角色中。

getUserPrincipal方法确定远程用户(即来访者)的Principal名称并返回一个与远程用户对应的java.security.Principal对象。调用getUserPrincipal返回的Principal的getName方法返回远程用户的名字。这些API允许Servlet基于获得的信息做一些业务逻辑决策。

如果没有用户通过身份认证,getRemoteUser方法返回null,isUserInRole方法总返回false,getUserPrincipal方法返回null。

isUserInRole方法需要一个字符串用户的角色名称参数。应该在部署描述符中声明一个security-role-ref元素,其有一个role-name子元素,包含了传递到方法的角色名称。security-role-ref元素可能包含一个role-link子元素,其值是用户可能会被映射到的安全角色名称。当决定返回调用值时,容器使用security-role-ref映射到的security-role。

例如,映射安全角色引用“FOO”到role-name为"manager"的安全角色的语法是:

元素

描述

默认值

value

HttpConstraint 定义了应用到没有在httpMethodConstraints 返回的数组中表示的所有HTTP方法的保护。

@HttpConstraint

httpMethodConstraints

HTTP方法的特定限制数组

{}

@HttpConstraint

@HttpConstraint注解用在@ServletSecurity注解中表示应用到所有HTTP协议方法的安全约束,且HTTP协议方法对应的@HttpMethodConstraint没有出现在@ServletSecurity注解中。

元素

描述

默认值

value

(仅)当rolesAllowed返回一个空数组时应用的默认授权语义。

PERMIT

rolesAllowed

包含授权角色的数组

{}

transportGuarantee

在连接的请求到达时必须满足的数据保护需求。

NONE

@HttpMethodConstraint

@HttpMethodConstraint注解用在@ServletSecurity注解中表示在特定HTTP协议消息上的安全约束。

元素

描述

默认值

value

HTTP协议方法名

 

emptyRoleSemantic

(仅)当rolesAllowed返回一个空数组应用的默认授权语义。

PERMIT

rolesAllowed

包含授权角色的数组

{}

transportGuarantee

在连接的请求到达时必须满足的数据保护需求。

NONE

 

@ServletSecurity注解可以指定在(更准确地说,目标是) Servlet实现类上,且根据@Inherited元注解定义的规则,它的值是被子类继承的。至多只有一个@ServletSecurity注解实例可以出现在Servlet实现类上,且@ServletSecurity注解必须不指定在(更准确地说,目标是)Java方法上。

当一个或多个@HttpMethodConstraint注解定义在@ServletSecurity注解中时,每一个@HttpMethodConstraint定义的security-constraint,其应用到@HttpMethodConstraint中标识的HTTP协议方法。围绕的@ServletSecurity注解定义了应用到所有HTTP协议方法的security-constraint,除了那些定义在@ServletSecurity中的@HttpMethodConstraint相关的HTTP协议方法。

定义在便携式部署描述符中的security-constraint元素用于对所有出现在该约束中的url-pattern授权。

当在便携式部署描述符中的一个security-constraint包含一个url-pattern,其精确匹配一个使用@ServletSecurity注解的模式映射到的类,该注解必须不影响Servlet容器在该模式上实施的强制约束。

当为便携式部署描述符定义了metadata-complete=true时,@ServletSecurity注解不会应用到部署描述符中的任何url-pattern映射到(任何servlet映射到)的注解类。

@ServletSecurity注解不应用到ServletRegistration使用ServletContext接口的addServlet(String, Servlet)方法创建的url-pattern,除非该Servlet是由ServletContext接口的createServlet方法构建的。

除了上面列出的,当一个Servlet类使用了@ServletSecurity注解,该注解定义的安全约束应用到所有url-pattern映射到的所有Servlet映射到的类。

当一个类没有加@ServletSecurity注解时,应用到从那个类映射到的Servlet的访问策略是由合适的security-constraint元素确定的,如果有,在相关的便携式部署描述符中,或者由约束禁止任何这样的标签,则如果有,通过ServletRegistration接口的setServletSecurity方法编程式为目标servlet确定。

13.4.1.1示例

以下示例演示了ServletSecurity注解的用法。

代码示例13-1  用于所有HTTP方法,且无约束

url-pattern

http-method

许可的角色

支持的连接类型

/*

所有方法

除GET,POST

阻止访问

不限制

/acme/wholesale/*

所有方法

除GET,POST

阻止访问

不限制

/acme/wholesale/*

GET

CONTRACTOR

SALESCLERK

不限制

/acme/wholesale/*

POST

CONTRACTOR

CONFIDENTIAL

/acme/retail/*

所有方法

除GET,POST

阻止访问

不限制

/acme/retail/*

GET

CONTRACTOR

HOMEOWNER

不限制

/acme/retail/*

POST

CONTRACTOR

HOMEOWNER

不限制

13.8.3 处理请求

当servlet容器接收到一个请求,它将使用119页“使用URL路径”描述的规则来选择在请求URI最佳匹配的url-pattern上定义的约束(如果有)。如果没有约束被选择,容器将接受该请求。否则,容器将确定在选择的模式上是否此请求的HTTP方法是受约束的。如果不是,请求将被接受。否则,请求必须满足在url-pattern应用到HTTP方法的约束。请求被接受和分派到相关的servlet,必须满足以下两个规则。

1. 接收到的请求的连接特性必须满足至少一种由约束定义的支持的连接类型。如果该规则不满足,容器将拒绝该请求并重定向到HTTPS端口。(作为一种优化,容器将以拒绝该请求为forbidden 并返回403 (SC_FORBIDDEN)状态码,如果知道该访问最终将被阻止 (通过没有指定角色的授权约束))

2. 请求的认证特性必须满足任何由约束定义的认证和角色要求。如果该规则不能满足是因为访问已经被阻止(通过没有指定角色的授权约束),则请求将被拒绝为forbidden 并返回403 (SC_FORBIDDEN)状态码给用户。如果访问是受限于许可的角色且请求还没有被认证,则请求将被拒绝为unauthorized 且401(SC_UNAUTHORIZED)状态码将被返回以导致身份认证。如果访问是受限于许可的角色且请求的认证身份不是这些角色中的成员,则请求将被拒绝为forbidden 且403状态码(SC_FORBIDDEN)将被返回到用户。

13.9 默认策略

默认情况下,身份认证并不需要访问资源。当安全约束(如果有)包含的url-pattern是请求URI的最佳匹配,且结合了施加在请求的HTTP方法上的auth-constraint(指定的角色),则身份认证是需要的。同样,一个受保护的传输是不需要的,除非应用到请求的安全约束结合了施加在请求的HTTP方法上的user-data-constraint(有一个受保护的transport-guarantee)。

13.10 登录和退出

容器在分派请求到servlet引擎之前建立调用者身份。在整个请求处理过程中或直到应用成功的在请求上调用authenticate、login或logout方法,调用者身份保持不变。对于异步请求,调用者身份建立在初始分派时,直到整个请求处理完成或直到应用成功的在请求上调用authenticate、login或logout方法,调用者身份保持不变。

在处理请求时登录到一个应用,精确地对应有一个有效的非空的与请求关联的调用者身份,可以通过调用请求的getRemoteUser或getUserPrincipal确定。这些方法的任何一个返回null值表示调用者没有登录到处理请求的应用。

容器可以创建HTTP Session对象用于跟踪登录状态。如果开发人员创建一个session而用户没有进行身份认证,然后容器认证用户,登录后,对开发人员代码可见的session必须是相同的session对象,该session是登录发生之前创建的,以便不丢失session信息。

 

热点排行