浅析 openLooKeng 安全认证机制
前言
通过 openLooKeng 的官网https://openlookeng.io/zh-cn/docs/docs/overview.html我们可以知道其支持对外部用户的认证的,主要方式有 Kerberos 和 Password(LDAP)认证,本文主要讲解其认证原理。
认证机制
在了解认证之前不得不提一下 Servlet 中的 FilterChain 的 doFilter 方法的作用如下图示,在客户端和服务器端之间会有很多 filter,通常称为 filter 链。通过 FilterChain 我们可能进行很多的过虑操作。当然我们也可以通过 Filter 对用户时进行认证。其中 openLooKeng 的认证就是在 Filter 中的 doFilter 完成的。
在 openLooKeng 的代码中认证相关的 filter 会在 ServerSecurityModule 类中进行注册,AuthenticationFilter 和 PaswordAuthenticatorManager 就是跟认证相关的。
当然从该模块中我们还知道除了支持 Kerberos 和 Password 认证之外还支持 CERTIFICATE 和 JWT。
当请求来到时会先经过前面注册的 AuthenticationFilter,该类实现了 Filter 的 doFilter 方法,
在其中我们可以看到可以支持内部的认证、webUI 认证和外部认证,这里主要讲解外部内证,
这里会根据配置认证方式进行遍历,并调用对应的认证模式进行认证,认证通过后则进入下一下 Filter 进行处理,最后请求到达服务器端的 rest 接口内部,进行相应 服务处理。
支持的认证方式
前面讲解到会在 doFilter 方法进行认证,其中 Authenticator 是一个接口,看到其中有 4 种实现,下面主要以 Kerberos 和 Password 为例进行讲解。
Kerberos 认证
Kerberos 认证主要在 KerberosAuthenticator 类中完成的,在类初始化的时候会根据配置的信息如 krb5.conf、keytab 和 principal 等信息初始化好 loginContext。当有请求带来时,会从 request 中取出用户信息或是 token 进行认证,如下:
当成功认证后会返回 KerberosPrincipal 继续传递给下一个 Filter。具体的 Kerberos 认证原理可以查看 Kerberos 官网,这里不做详细描述。
Password 认证
除了上面说的支持 Kerberos 的认证外,还支持密码认证,默认支持的是基于 LDAP 的密码认证。密码的认证是主要在 PasswordAuthenticator 类中的 authenticate 完成的,同样的也是从 request 中取出用户名和密码交给 authenticatorManager 进行认证。
目前我们看到 PasswordAuthenticator 的接口只有 LDAP 的实现。
在 LdapAuthenticator 类中认证主要由 authenticate 方法完成的。里面会调用 LDAP 相关的 API 跟 LDAP 服务器进行交互完成认证。
Password 认证框架
其实 openLooKeng 密码认证是以 plugin 方式进加载的,可以解压编译好的包在 plugin 路径下可以看到 password 相关的 plugin。
从代码上看到 PasswordAuthenticatorPlugin 是实现了 Plugin 接口的,其中里面添加了 LdapAutehnticatorFactory。
而 LdapAutehnticatorFactory 类则是实现了 PasswordAuthenticatorFactory 接口,该接口主要提供了两个方法一个 getName 和 create,其中在 LdapAuthenticatorFactory 中 getName 返回的是 ldap,以区别其他密码认证模式,create 方法中则是通过 airlift 框架初始化 LdapAuthenticator 实例,保存在 PasswordAuthenticatorManager 类中,这样当进行密码认证的时候从该类中取出对应的 Authenticator 实例即可。
另外在系统启动的时候,会由 PasswordAuthenticatorManager 调用 addPasswordAuthenticatorFactory 接口加载多个 PasswordAuthenticatorFactory 实现类,如下:
当 plugin 加载完成后再由 PasswordAuthenticatorManager 类调用 loadPasswordAuthenticator 方法完成具体 PasswordAuthenticator 实现的创建:
这个便是 openLooKeng 整个密码认证框架的运行原理。
扩展认证
根据前面的介绍,我们可以看出如果实现自己的认证方式的话,笔者认为可以有两种主要方式:
第一种是基于 persto-main 模块的接口 Authenticator 直接实现自己认证和配置即可。
第二种如果是基于密码认证,那么可以这样实现:
通过上面的步骤后那么 openLooKeng 启动时也会加载自己实现的 Factory。只要在配置文件中配置成自己实现的认证即可使用。
本文作者:曾德永
转载请联系 openLooKeng 小助手(微信:openLooKengoss)
版权声明: 本文为 InfoQ 作者【openLooKeng】的原创文章。
原文链接:【http://xie.infoq.cn/article/2fe85864f07c9e9ac6b6a6043】。文章转载请联系作者。
评论