From a15bc6f3ac913ff2c2c952348590c6ae2f795c53 Mon Sep 17 00:00:00 2001 From: zeekling Date: Sat, 21 Sep 2024 00:16:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/authenticated.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/common/authenticated.md b/common/authenticated.md index 6043b98..fb00cac 100644 --- a/common/authenticated.md +++ b/common/authenticated.md @@ -100,5 +100,34 @@ auth.authenticate(url, token); # 服务端认证 +## 初始化 + +服务端初始化的入口函数类为AuthenticationFilter, 可以在web启动的时候将当前filter配置为AuthenticationFilter。用来实现服务端认证功能。 + +其中函数init为filter的初始化函数,主要作用是加载authHandler以及其他参数。在加载完authHandler之后会调用authHandler的init函数。 +用来初始化authHandler。KerberosAuthenticationHandler就是一种authHandler。在初始化的时候会加载keytab和principal等信息。 +并且初试化gssManager。 + +## 认证 + +认证的入口函数filter函数。对于大部分的authHandler,最终认证都是调用authHandler的authenticate函数。针对KerberosAuthenticationHandler来讲。 + +在需要认证的时候返回401,如下代码: +```java +response.setHeader(WWW_AUTHENTICATE, KerberosAuthenticator.NEGOTIATE); +response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); +``` + +通过下面代码获取客户端Token。客户端的Token对应的keytab必须包含HTTP/* + +```java +authorization = authorization.substring(KerberosAuthenticator.NEGOTIATE.length()).trim(); +final Base64 base64 = new Base64(0); +final byte[] clientToken = base64.decode(authorization); +``` + +在与客户端的认证的过程中,可能会需要多次交换token(参考客户端流程),如果是在交互过程中,http请求的返回码是401。如果认证成功,状态码则是200. + +