大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持:
- 身份验证:验证授权用户的用户名和密码
- 资源访问控制:限制某些资源只允许部分用户访问
- 数据完整性:能够证明数据在传输过程中未被第三方修改
- 机密性或数据隐私:传输加密(SSL),确保信息只能被信任用户访问
本文就以上问题,对 Tomcat 容器提供的认证和鉴权的设计与实现,以及内部单点登录的原理进行分析。首发于微信公众号顿悟源码.
1. 授权
容器和 Web 应用采用的是基于角色的权限访问控制方式,其中容器需要实现认证和鉴权的功能,而 Web 应用则要实现授权的功能。
在 Servlet 规范中描述了两种授权方式:声明式安全和编程式安全。声明式安全就是在部署描述符中声明角色、资源访问权限和认证方式。以下代码片段摘自 Tomcat 自带的 Manager 应用的 web.xml:
<security-constraint> <!-- 安全约束 -->
<web-resource-collection> <!-- 限制访问的资源集合 -->
<web-resource-name>HTML Manager commands</web-resource-name>
<url-pattern>/html/*</url-pattern>
</web-resource-collection>
<auth-constraint><!-- 授权可访问此资源集合的角色 -->
<role-name>manager-gui</role-name>
</auth-constraint>
</security-constraint>
<login-config><!-- 配置验证方法 -->
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Manager Application</realm-name>
</login-config>
<security-role><!-- 定义一个安全角色 -->
<description>
The role that is required to access the HTML Manager pages
</description>
<role-name>manager-gui</role-name>