Jetty 认证架构
Jetty authentication architecture
Jetty 身份验证架构使用以下 4 个接口:
org.eclipse.jetty.server.UserIdentity
org.eclipse.jetty.security.LoginService
org.eclipse.jetty.security.IdentityService
java.security.Principal
有人可以解释这 4 个接口在身份验证流程中如何相互交互。
浏览代码似乎不是很有帮助,因为有太多极端情况。我只是对主流感兴趣。
这个问题很难回答,因为它非常开放/模糊。
我会先尝试简单的答案。
首先,基础知识,JVM 提供了什么:
java.security.Principal
- 这是保存个人/公司/组(登录名)的 Servlet 规范对象。
javax.security.auth.Subject
- 这包含有关 Principal 的相关信息(请参阅 link 到 javadoc 以获取它可以显示的内容列表)
现在 Jetty 细节:
org.eclipse.jetty.server.UserIdentity
- 这表示用户的标识。又名用户的 Principal
和 Subject
(如果主体为空,则用户未通过身份验证)。这还包括一些帮助 isUserInRole(String)
样式逻辑的方法。
org.eclipse.jetty.security.IdentityService
- 这将 UserIdentity
与所属的范围/线程相关联。 (这是一个高级概念,一些安全实现需要挂钩以正确处理安全性。Jetty 仅附带默认行为,即仅为 UserIdentity
创建和执行此类关联。因为安全实现不需要它Jetty 附带)。
org.eclipse.jetty.security.LoginService
- 这是安全实现的 API,用于来自 login()
和 logout()
的 create/validate/destroy 运行时 UserIdentity
对象样式事件。
最后,它是如何联系在一起的:
- A
org.eclipse.jetty.security.Authenticator
负责身份验证部分的 HTTP 部分,例如响应 401 Unauthorized
和 403 Forbidden
。它使用 LoginService
来做它的事情。
LoginService
使用 IdentityService
将 UserIdentity
关联到处理请求的线程。
- 默认的 Servlet 行为通过
HttpServletRequest.getUserPrincipal()
直接公开 Principal
。
Subject
无法通过标准 Servlet API 使用。
UserIdentity
通过 HttpServletRequest.isUserInRole(String role)
方法部分公开。
- 无法通过 Servlet API 直接访问
LoginService
,但您可以分别使用 HttpServletRequest.login(String user, String pass)
and HttpServletRequest.logout()
来访问这些基本功能。
- 还有一些自动连接的 Servlet 规范的身份验证和授权功能:
WEB-INF/web.xml
中的任意 <security-constraint>
部分
javax.annotation.security
注释的使用:
Jetty 身份验证架构使用以下 4 个接口:
org.eclipse.jetty.server.UserIdentity
org.eclipse.jetty.security.LoginService
org.eclipse.jetty.security.IdentityService
java.security.Principal
有人可以解释这 4 个接口在身份验证流程中如何相互交互。
浏览代码似乎不是很有帮助,因为有太多极端情况。我只是对主流感兴趣。
这个问题很难回答,因为它非常开放/模糊。
我会先尝试简单的答案。
首先,基础知识,JVM 提供了什么:
java.security.Principal
- 这是保存个人/公司/组(登录名)的 Servlet 规范对象。javax.security.auth.Subject
- 这包含有关 Principal 的相关信息(请参阅 link 到 javadoc 以获取它可以显示的内容列表)
现在 Jetty 细节:
org.eclipse.jetty.server.UserIdentity
- 这表示用户的标识。又名用户的Principal
和Subject
(如果主体为空,则用户未通过身份验证)。这还包括一些帮助isUserInRole(String)
样式逻辑的方法。org.eclipse.jetty.security.IdentityService
- 这将UserIdentity
与所属的范围/线程相关联。 (这是一个高级概念,一些安全实现需要挂钩以正确处理安全性。Jetty 仅附带默认行为,即仅为UserIdentity
创建和执行此类关联。因为安全实现不需要它Jetty 附带)。org.eclipse.jetty.security.LoginService
- 这是安全实现的 API,用于来自login()
和logout()
的 create/validate/destroy 运行时UserIdentity
对象样式事件。
最后,它是如何联系在一起的:
- A
org.eclipse.jetty.security.Authenticator
负责身份验证部分的 HTTP 部分,例如响应401 Unauthorized
和403 Forbidden
。它使用LoginService
来做它的事情。 LoginService
使用IdentityService
将UserIdentity
关联到处理请求的线程。- 默认的 Servlet 行为通过
HttpServletRequest.getUserPrincipal()
直接公开Principal
。 Subject
无法通过标准 Servlet API 使用。UserIdentity
通过HttpServletRequest.isUserInRole(String role)
方法部分公开。- 无法通过 Servlet API 直接访问
LoginService
,但您可以分别使用HttpServletRequest.login(String user, String pass)
andHttpServletRequest.logout()
来访问这些基本功能。 - 还有一些自动连接的 Servlet 规范的身份验证和授权功能:
WEB-INF/web.xml
中的任意 javax.annotation.security
注释的使用:
<security-constraint>
部分