`
bsr1983
  • 浏览: 1101149 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet3.1标准学习笔记四

 
阅读更多
54.声明式安全是指以在应用外部的形式表达应用的安全模型需求,包括角色、访问控制和认证需求。部署描述符是web应用中的声明式安全的主要手段。
编程式安全包括以下HttpServletRequest接口的方法:
(1)authenticate 允许应用由容器发起在一个不受约束的请求上下文内的来访者请求认证。
(2)login 允许应用执行用户名和密码收集(作为一种Form-Based Login的替代)。
(3)logout 提供用于应用重置来访者的请求身份。
(4)getRemoteUser 又涌起返回与该请求相关的远程用户(即来访者)的名字。
(5)isUserInRole 确定是否与该请求相关的远程用户(即来访者)在一个特定的安全角色中。
(6)getUserPrincipal 确定远程用户(即来访者)的Principal名称并返回一个与远程用户相关的java.security.Principal对象。调用getUserPrincipal返回的Principal的getName方法返回远程用户的名字。这些API允许Servlet基于获取的信息做一些业务逻辑决策。
55.@ServletSecurity提供了用于定义访问控制约束的另一种机制,相当于那些通过在便携式部署描述符中声明式或通过ServletRegistration接口的serServletSecurity方法编程式表示。Servlet容器必须支持在实现javax.servlet.Servlet接口的类(和它的子类)上使用@ServletSecurity注解。
@HttpConstraint注解用在@ServletSecurity中标示应用到所有HTTP协议方法的安全约束,且HTTP协议方法对应的@HttpMethodConstraint没有出现在@ServletSecurity注解中。
@HttpMethodConstraint注解用在@ServletSecurity注解中表示在特定HTTP协议消息上的安全约束。
定义在便携式部署描述符中的security-constraint元素用于对所有出现在该约束中的url-pattern授权。
当在便携式部署描述符中的一个security-constraint包含一个url-pattern,其精确匹配一个使用@ServletSecurity注解的模式映射到的类,该注解必须在由容器在该模式上强制实施的约束上没有效果。
@ServletSecurity注解用于定义一个方法无关的@HttpConstraint,且紧跟着一个包含零个或多个@HttpMethodConstaint规格的列表。方法无关的约束应用到那些没有定义HTTP特定方法约束的所有HTTP方法。
当没有包含@HttpMethodConstraint元素,@ServletSecurity注解相当于包含一个web-resource-collection的单个security-constraint元素,且web-resource-collection不包含http-method元素,因此涉及到所有HTTP方法。
ServletContextListener内的setServletSecurity方法用于定义应用到ServletRegistration定义的映射的安全约束。
Collection<String> setServletSecurity(ServletSecurityElement arg);
serServletSecurity方法返回一组URL pattern(可能空),其已是便携式部署描述符中的security-constraint元素的精确目标(因此,调用是不影响的)。
如果ServletContext中得到的ServletRegistration已经被初始化了,该方法抛出IllegalStateException。
当便携式部署描述符中的security-constraint包含一个url-pattern其精确匹配ServletRegistration映射的pattern,调用ServletRegistration的setServletSecurity必须对Servlet容器对pattern实施的约束没有任何影响。
56.安全角色是由应用开发人员或装配人员定义的逻辑用户分组。当部署了应用,由部署人员映射觉得到运行时环境的principal或组。
Servlet容器根据principal的安全属性为与进入请求相关的principal实施声明式或编程式安全。
这可能以如下任一方式发生:
(1)部署人员以及映射一个安全觉得到运行环境中的一个用户组。调用的principal所属的用户组取自其安全属性。仅当principal所属的用户组由部署人员已经映射了安全角色,principal是在安全角色中。
(2)部署人员已经映射安全角色到安全策略域中的principal名字。在这种情况下,调用的principal的名字取自其安全属性。仅当principal名字与安全角色一映射到的principal名字一样时,principal是在安全角色中。
57.web客户端可以使用一下机制之一向web服务器认证用户身份:
(1)HTTP基本认证(HTTP Basic Authentication)
HTTP基本认证基于用户名和密码,是HTTP1.0规范中定义的认证机制。Web服务器请求web客户端认证用户。作为请求的一部分,web服务器传递realm(字符串)给要被认证的用户。Web客户端获取用户的用户名和密码并传给web服务器。Web服务器在指定的realm认证用户。
基本认证是不安全的认证协议。用户密码以简单的base64编码发送,且未认证目标服务器。
(2)HTTP摘要认证(HTTP Digest Authentication)
与HTTP基本认证类似,HTTP摘要认证也是基于用户名和密码认证的用户,但不像HTTP基本认证,HTTP摘要认证不再网络上发送用户密码。在HTTP摘要认证中,客户端发送单向散列的密码(和额外的数据)。尽管密码不在线路上发生,HTTP摘要认证需要对认证容器可用的明文密码等价物,以致容器可以通过计算与其的摘要验证接收到的认证者。Servlet容器应支持HTTP_DIGEST身份认证。
(3)HTTPS客户端认证(HTTPS Client Authentication)
Web应用部署描述符包含登录表单和错误页面条目。登录界面必须包含用于输入用户名和密码的字段。这些字段必须分别命名为j_username和j_password。
当用户试图访问一个受保护的web资源,容器坚持用户的认证。如果用户已经通过认证则具有访问资源的权限,请求的web资源被激活并返回一个引用。
(4)基于表单的认证(Form Based Authentication)
当进行一个不受保护的传输时,基于表单的认证受制于一些与基本验证一样的相同的脆弱性。
当触发认证的请求在一个安全传输之上到达,或者登陆页面受制于一个CONFIDENTIAL user-data-constraint,登录页面必须返回给用户,并在安全传输之上提交到容器。
HttpServletRequest接口的login方法提供另一种用于应用控制它的登录界面外观的手段。
基于表单的登录和基于URL的session跟踪可以通过编程实现。基于表单的登录应该仅被用在当session由cookie或SSL session信息维护时。
为了进行适当的认证,登录表单的action总是j_security_check。该限制使得不管请求什么资源,登录表单都能工作,且避免了要求服务器指定输出表单的action字段。登录表单应该在密码表单字段上指定autocomplete="off";
58.安全约束是一种定义web内容包含的声明式方式。安全约束关联授权和/或在web资源上对HTTP操作的用户数据约束。安全约束,在部署描述符中由security-constraint表示,其包含以下元素:
(1)web资源集合(部署描述符中的web-resource-collection)
(2)授权约束(部署描述符中的auth-constraint)
(3)用户数据约束(部署描述符中的user-data-constraint)
HTTP操作和网络资源的安全约束应用(即受限的请求)根据一个或多个web资源集合识别。Web资源集合包含以下元素:
(1)URL模式(部署描述符中的url-pattern)
(2)HTTP methods(部署描述符中的http-method或http-method-omisssion元素)
授权约束规定认证和命名执行守约束请求的被许可的授权角色的要求。用户必须至少是许可执行受约束请求的命名角色中的一个成员。
特殊角色名“*”是定义在部署描述符中的所有角色名的一种简写。
特殊角色名“**”是一种用于任何授权的用户不受约束的角色的速记法。它表示任何授权的用户,不受约束的角色,被授权允许执行约束的请求。没有指定角色的授权约束表示在任何情况下不允许访问受约束请求。
授权约束包含以下元素:
(1)role name(部署描述符中的role-name)
用户数据约束规定了在受保护的传输层连接之上接收约束的请求的要求,需要包含的强度由传输保障的值定义。INTEGRAL类型的传输保障用于规定内容完整性要求,且传输保障CONFIDENTIAL用于规定保密性要求的。传输保障“NONE”表示当容器通过任何包括不受保护的连接接收到请求时,必须接收此受约束的请求。容器可能在响应中抢救一个收报纸的传输保障(confidential transport guarantee)为INTEGRAL值。用户数据约束包括如下元素:
(2)transport guarantee(部署描述符中的transport-guarantee)
如果没有授权约束应用到请求,容器必须接受请求,而不要求用户身份认证。如果没有用户数据约束应用到请求,当容器通过任何包括不受保护的连接接受到请求时,必须接收此请求。
59.当url-pattern和HTTP方法以组合方式(即,在web-resource-collection中)出现在多个安全约束中,该约束(在模式和方法上的)是通过合并单个约束定义的。以相同的模式和方法出现在组合约束规则如下所示:
授权约束组合,其明确指定角色或通过"*"隐式指定角色,可产生单个约束的合并的角色名称作为许可的角色。一个命名觉得“**”的授权约束命名的或隐式的角色组合以允许任何授权的用户不受约束的角色。不包含授权约束的安全约束将与明确指定角色的或隐式指定角色的允许未授权访问的安全约束合并。授权约束的一个特殊情况是其没有指定角色,将与任何其他约束合并并覆盖它们的作用。这导致访问被阻止。
60.(1)web-app元素是一个Web应用程序的根部署描述符。此元素包含下列元素。这个元素有一个必须的属性version来指定部署描述符符合哪个版本的模式。此元素的所有子元素可以是任意的顺序。
(2)description元素提供了父元素的文本描述。
(3)displ-name元素包含一个简短的名称,目的是通过攻击显示,显示名称不必是唯一的。
(4)icon元素包含small-icon和large-icon元素,为大型和小型GIF或JPEG图标图片指定文件名,用于在GUI工具中标示父元素。
(5)distributable元素表示设定该Web应用程序适合部署到一个分布式的servlet容器中。
(6)context-param元素包含了Web应用程序的servlet上下文初始化参数的声明。
(7)filter元素声明了Web应用程序中的过滤器。该过滤器映射到一个servlet或filter-mapping元素中的一个URL模式,使用filter-name的值来引用。过滤器在运行时可以通过FilterConfig接口中访问部署描述文件中声明的初始化参数。filter-name元素是过滤器的逻辑名称。他在Web应用程序中必须是唯一的。filter-name元素的元素内容不能为空。filter-class是过滤器的完全限定类名。init-param元素包含的名值对作为此过滤器的初始化参数。当指定可选的async-supported元素时,表示该过滤器支持异步请求处理。
(8)容器使用filter-mapping决定哪个过滤器以什么样的顺序应用到请求。filter-name的值必须是部署描述文件中声明的过滤器中的一个。匹配的请求可以被指定为url-pattern或servlet-name。
(9)listener表示应用程序监听器bean的部署属性。子元素listener-class声明应用程序中的一个类必须注册为Web应用程序监听器bean。它的值是监听器类的完全限定类名。
(10)servlet元素用于声明一个servlet。它包含一个servlet的声明性数据。jsp-file元素包含到以"/"开头的Web应用程序中一个JSP文件的完全路径。如果制定了jsp-file并且存在load-on-start元素,那么JSP应该被预编译和加载。servlet-name元素包含了servlet的规范名称。在Web应用程序中每个servlet的名称是唯一的。servlet-name元素的内容不能为空。servlet-class包含了servlet的完全类限定么。run-as元素指定用作一个组件执行的标识。它包含一个可选的description,和一个由role-name元素指定安全角色。load-on-startup元素表示该servlet应该被加载的顺序。如果该值是一个负整数,或不在该元素,容器自由选择什么时候加载这个servlet。如果该值是一个正整数或0,当应用部署后容器必须加载和初始化这个servlet。容器必须保证较小整数标记的servlet在较大整数标记的servlet之前加载。容器可以选择具有相同load-on-startup值的servlet的加载顺序。security-role-ref元素声明组件或部署组件的代码中的安全角色引用。它由一个可选的description,在代码中使用的安全角色名称(role-name),以及一个可选的到一个安全角色(role-link)的链接组成。如果没有指定安全角色,部署器必须选择一个合适的安全角色。当指定了可选的async-support元素,指示的servlet可支持异步请求处理。如果一个servlet支持文件上传功能和mime-multipart请求处理,通过描述文件中的multipart-config元素能够提供相同的配置。multipart-config元素可用于指定文件存储的位置,上传文件大小的最大值,最大请求大小和文件将写入磁盘之后的大小阈值。
(11)servlet-mapping元素定义了servlet和URL模式之间的映射。
(12)session-config元素定义了该Web应用程序的会话参数。子元素session-timeout定义了该Web应用程序中创建的所有会话的默认超时时间间隔。指定的超时时间必须使用分钟数表示。如果超时时间小于或等于0,容器将确保会话的默认行为永远不会超时。如果没有指定这个元素。容器必须设置它的缺省超时期限。
(13)mime-mapping定义了扩展名和MIME类型直接的映射。extension元素包含一个字符串描述的扩展名。
(14)welcome-file-list元素包含了一个有序的欢迎文件列表。子元素welcome-file包含一个用作缺省欢迎文件的文件名。
(15)error-page包含一个错误代码或异常类型到Web应用程序中资源的路径之间的映射。不过,error-code或exception-type元素可以省略来指定一个默认的错误页面。子元素exception-type包含了一个Java异常类型的完全限定名称。子元素location包含了web应用程序中相对于web应用程序干目录的资源位置。location的值必须以'/'开头。
(16)jsp-config用来提供Web应用程序中的JSP文件的全局配置信息。它有两个子元素,taglib和jsp-property-group。taglib元素可用来为Web应用程序中的JSP页面使用的标签库提供信息。
(17)security-constraint元素用于关联安全约束和一个或多个Web资源集合。子元素web-resource-collection确定安全约束应用到哪一些Web应用程序中资源的子集和这些资源的HTTP方法。auth-constraint表示拥护角色应该允许访问此资源集合。这里使用的role-name必须与该Web应用程序定义的其中一个security-role元素的role-name对应,或是指定的保留role-name“*”对应。这是一个表示web应用程序中的所有角色的紧凑语法。如果“*”和角色名都出现了,容器会将此解析为所有角色。如果没有定义觉得,不允许任何用户访问由包含security-constraint所描述的Web应用程序的部分。当容器确定访问时匹配角色名称是区分大小写的。user-data-constraint表示客户端和容器之间的通信数据如何受到子元素transport-guarantee的保护。transport-guarantee的合法值是NONE,INTEGRAL或CONFIDENTIAL之一。
(18)login-config用于配置应该使用的验证方法,可用于此应用程序的领域名,以及表单登录机制所需要的属性。子元素auth-method为Web应用程序配置验证机制。该元素的内容必须是BASIC、DIGEST、FORM、CLIENT-CERT或vendor-specific验证模式。realm-name表示为Web应用程序选择用于验证模式的领域名。form-login-config指定应该用于基于表单登录的登录和错误页面。如果不使用基于表单的登录方式,这些元素将被忽略。
(19)security-role定义了一个安全角色。子元素role-name指定安全角色的名称。该名称必须符合NMTOKEN的词法规则。
(20)env-entry声明了一个应用程序的环境入口。子元素env-entry-name包含部署组件环境入口的名称。这个名称是一个相对于java:comp/env上下文的JNDI名称。在部署组件中该名称必须是唯一的。env-entry-type包含了应用程序代码所期望的环境入口值的Java类型完全限定名。子元素env-entry-value指定部署组件的环境入口值。该值必须是一个String,对指定的使用一个String或java.lang.Character类型作为参数的构造器有效。可选的injection-target元素用来定义把指定的资源注入到字段或JavaBean属性。injection-target指定了类中应该被注入资源的类和名称。injection-target-class制定了注入目标的完全限定类名称、injection-target-name制定了指定雷中的目标。首先把查找目标作为一个JavaBean属性名称。如果没有找到,则把查找目标作为一个字段名。在类初始化期间通过调用目标属性的set方法或给名称字段设置一个值将指定的资源注入到目标。如果环境入口指定了一个injection-target,那么env-entry-type可以省略或必须与注入目标的类型匹配。如果没有指定injection-target,那么需要指定env-entry-type。
(21)ejb-ref声明了一个对企业bean的home应用。ejb-ref-name制定了引用企业bean的部署组件代码中使用的名称。ejb-ref-type是引用的企业bean期望的类型,它可以是Entity或Session。home定义了引用的企业bean的home接口的完全限定名称。remote定义了引用的企业bean的remote接口的完全限定名称。ejb-link指定了连接到企业bean的一个EJB应用。injection-target元素可以用于定义指定的企业bean注入到一个组件的字段或属性。
(22)ejb-local-ref声明了对企业bean的本地home引用。local-home定义了企业bean的本地home接口的完全限定名称。local定义了企业bean的本地接口的完全限定名称。
(23)service-ref声明了一个对Web service的引用。service-ref-name声明了用于查找Web service模块组件的逻辑名称。建议所有service的引用名称以/service/开头。service-interface定义了客户端依赖的JAX-WS Service接口的完全限定类名称。在大多数情况下,这个值是javax.xml.rpc.Service。也可以指定一个JAX-WS生成的服务接口类。wsdl-file元素包含了WSDL文件的URI位置。这个位置相对于模块根目录。jaxrpc-mapping-file包含了描述应用程序使用的Java接口和wsdl-file中的WSDL描述之间的JAX-WS映射的文件名。这个文件名是一个模块文件中的相对路径。
(24)resource-ref元素包含了部署组件对外部资源的引用声明。res-ref-name指定了一个资源管理器连接工程引用的名称。这个名称是一个相对于java:com/env上下文的JNDI名称。在部署文件中这个名称必须是唯一的。res-type元素指定数据源的类型。该类型是一个希望由数据源实现的Java语言类或接口的完全限定名。res-auth指定部署组件代码是否以编程方式注册到资源管理器,或容器是否将代表的部署组件注册到资源管理器。如果是第二种情况,容器使用部署器提供的注册信息。res-sharing-scope指定了通过给定的资源管理器连接工厂引用获取的连接是否可以共享。如果制定了这个值,它必须是Shareable或Unshareable。可选的injection-target元素用于定义把指定的资源注入到字段或JavaBean属性。
(25)resource-env-ref包含了部署组件和对部署组件环境中的资源有关的关联对象的引用。resource-env-ref-name指定了资源环境引用的名称。它的值是部署组件代码中使用的环境入口名称,它是一个相对于java:comp/env上下文的JNDI名称,并且在部署组件中必须唯一的。resource-env-ref-type制定了资源环境引用的类型。它是一个Java语言类或接口的完全限定名。可选的injection-target元素用于定义把指定的资源注入到字段或JavaBean属性。必须提供resource-env-ref-type除非指定了注入目标,在这种情况下,将使用目标的类型。如果两者都指定,该类型必须与注入目标的类型兼容。
(26)message-destination-ref元素包含了部署组件和对部署组件环境中的资源有关的目标的引用声明。message-destination-ref-name元素制定了一个目标引用的名称,它的值是部署组件代码中使用的环境入口名称。
(27)message-destination指定消息的目标。这个元素所描述的逻辑目标由部署映射到物理目标。message-destination-name元素指定了消息目标的名称。该名称在部署文件的消息目标名称中必须是唯一的。
(28)local-encoding-mapping-list包含了语言环境和编码直接的映射。由子元素locale-encoding-mapping指定。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics