Principal与Subject
Principal是用户或组认证通过后赋予的标识。Principal就象是信用卡,当一个用户通过了发卡机构的认证后就发给他一张卡,表明其身份。那么同一个用户可能会办多张卡,所以一个用户就可能会有多个Principal,这就需要一个容器,这就是Subject,所以Subject更象是一个装着各种卡片的钱包。如下图:
从上图我们可以看出,用户除了本身标识以外,用户还可以属于不同的用户组,也可能归属其它类型,所以用户在完成JAAS认证登录后可能会得到几个不同的Principals,然后统统将其放入Subject中。
LoginModule
LoginModule是Authentication Provider的核心组件,也就是说真正的认证动作就是由它完成。Authentication Provider与loginModule只能是一对一的关系。对于不同的认证方式(例如:用户名/密码、证书、指纹、全程认证等)需要不同的Authentication Provider,这也意味着不同的LoginModule。如果一个安全域(Security Realm)中配置了多个Authentication Provider,那么每个Authentication Provider的LoginModule认证生成的Principals会被放入同一个Subject。另外,如果一个安全域(Security Realm)中配置了多个Authentication Provider时,这些Authentication Provider也可以指定协作关系,这由Control Flag来控制。
Principal Validation Provider
Principal Validation Provider是Authenticator Provider的helper,其主要功能是防止对Principal的恶意篡改。通常来说,每种Principal对应一种Principal Validation。Principal Validation过程:
当用户完成认证过程后,将装有Principals的Subject提交给Principal Validation Provider,由其为Principals签名,然后将Subject返回给客户,当其它安全操作需要访问Subject中的Principal时,由Principal Validation Provider检查Principal是否被恶意篡改。
完整基于WebLogic安全框架的JAAS认证过程
注:这里以相对复杂的T3应用客户端为例,基于Web的认证相对简单,其原理类似。
1. T3应用向用户或系统请求认证相关信息,如:用户名、密码、URL。
2. T3应用创建CallbackHandler包含用户认证相关信息
- a. T3应用通过LoginContext将CallbackHandler传递到本地UsernamePasswordLoginModule
- b. UsernamePasswordLoginModule将包含认证信息的CallbackHandler传递给WebLogic Server RMI容器
3. WebLogic Server RMI容器调用WebLogic Serve安全框架。客户端传来的包含用户认证相关信息的CallbackHandler传入WebLogic Serve安全框架。
4. WebLogic Serve安全框架为每个已配置的Authentication Provider传入新创建的包含用户认证相关信息的本地CallbackHandler,注意:此CallbackHandler不同于T3应用传入的CallbackHandler。
5. WebLogic Serve安全框架调用与Authentication Provider关联的LoginModule完成用户认证
6. 如果认证通过
- Principals被Principal Validation Provider签名
- LoginModule将签过名的Principals放入Subject
- WebLogic Serve安全框架向T3应用返回认证状态,T3应用从WebLogic Serve安全框架取回认证过的Subject。
Identity Assertion Provider与全程认证(Perimeter Authentication)
上述讲基于Authentication Provider的认证过程中是用户或系统提供认证相关信息,例如:用户名、密码等。但是在真实的安全环境中,还有一种情况就是全程认证,也就是说用户已经在别处完成认证(例如:第三方SSO认证服务器、或证书),当用户请求到达WebLogic Server时,请求头中会带有安全令牌,要实现对安全令牌的解析就需要另一种认证提供程序,即:Identity Assertion Provider。认证过程如下:
带有令牌的用户请求先被Identity Assertion Provider截获,由其解析出相应的认证信息,例如:用户名。用户名通过JAAS的CallbackHandler传递到LoginModule完成认证过程,后面就和Authentication Provider认证过程一样了,此处不复述。这里需要注意的就是与Authentication Provider一样,每个Identity Asertion Provider只与一个LoginModule配对使用。
(完)