• cas 认证管理器


    CAS-默认的认证管理器:AuthenticationManagerImpl

    <bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">
        <property name="credentialsToPrincipalResolvers">
          <list>
            <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
                <property name="attributeRepository" ref="attributeRepository" />
            </bean>
            <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
         </list>
       </property>
       <property name="authenticationHandlers">
         <list>
          <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
                p:httpClient-ref="httpClient"  p:requireSecure="false"/>
          <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
         </list>
       </property>
    </bean>
    

    这个bean,就是cas的核心类,认证管理器。

    在cas中定义了两个术语:

    credentials
        即需要认证用户信息载体
        例如在web应用中,用户通过前台界面输入用户名,密码,然后经cas认证成功或失败。
        这个credentials它的其中一个实现类 org.jasig.cas.authentication.principal.UsernamePasswordCredentials,
        就代表了持有前台输入的用户名以及密码
        Principal cas认证后返回的信息载体,默认只返回用户名
    
    authenticationHandlers。
        从字面意思可以看出是认证处理器,即cas如何对于用户信息进行认证,即到哪里去认证;
        credentialsToPrincipalResolvers对于认证之后的用户信息转换为principal的转换解析器。
        这两个属性都是list既可以配置多个。
        在cas认证过程中逐个执行authenticationHandlers中配置的认证管理,直到有一个成功为止,
        然后在执行credentialsToPrincipalResolvers过程直到有一个成功为止。
        这是cas认证管理器的默认配置,我们从上面的分析会发现,默认配置在进行认证及转换解析是低效的,
        原因是它要执行两次for循环(当然这个低效也是相对的),那么是否可以提交应用效率呢?答案是肯定的。
    

    cas的认证管理器有三个实现类

    org.jasig.cas.authentication.AuthenticationManagerImpl;
    org.jasig.cas.authentication.DirectMappingAuthenticationManagerImpl;
    org.jasig.cas.authentication.LinkedAuthenticationHandlerAndCredentialsToPrincipalResolverAuthenticationManager
    第一个是默认实现类,第二个和第三个可以用来提高效率实现。
    对于普通的不追求性能的系统来说,cas的默认认证管理器是最合适不过了,它非常的灵活,易于扩展,
    只需要追加认证管理器与principal转换解析器就可以了,而无需关心其他。
    而在我们追求性能,而且需要对一种credentials进行多次认证处理(例如对于用户名密码组合从多个数据源进行验证),
    我们可以应用LinkedAuthenticationHandlerAndCredentialsToPrincipalResolverAuthenticationManager认证管理器;
    而对于不同credentials进行认证处理,我们可以应用DirectMappingAuthenticationManagerImpl认证管理器。
    
    LinkedAuthenticationHandlerAndCredentialsToPrincipalResolverAuthenticationManager从类名可以猜出它是将认证处理器与转换解析器进行对应实质上它就是做这件事件的,即将一个authenticaltionHandler指定一个credentialToprincipalResolver。
    它的一般配置与如下类似
    
    <bean id="authenticationManager" class="org.jasig.cas.authentication.LinkedAuthenticationHandlerAndCredentialsToPrincipalResolverAuthenticationManager">
       <constructor-arg name="linkedHandlers"  ref="authenticationHandlersAndPrincipalResolversMap" />
    </bean>
    <util:map id="authenticationHandlersAndPrincipalResolversMap">
      <entry key-ref="httpBasedAuthenticationHandler">
        <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
      </entry>
      <entry key-ref="ldapBindAuthenticationHandler">
        <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">
          <property name="attributeRepository" ref="attributeRepository" />
        </bean>
      </entry>
      <entry key-ref="ldapFastBindAuthenticationHandler">
        <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">
         <property name="attributeRepository" ref="attributeRepository" />
        </bean>
       </entry>
    </util:map>
    
    DirectMappingAuthenticationManagerImpl,它有一个private Map<CLass <? extends Credentials>,
    DirectAuthenticationHandlerMappingHolder> credentialsMapping属性,
    即对每一种credentials绑定一个DirectAuthenticationHandlerMappingHolder,
    而DirectAuthenticationHandlerMappingHolder实质就是持有一个认证处理器与一个pricipal转换解析器,这样就能将credentials,
    认证处理器与转换解析器进行绑定,它的一般配置类似如下:
    <bean id="authenticationManager" class="org.jasig.cas.authentication.DirectMappingAuthenticationManagerImpl">
      <property name="credentialsMapping">
        <map>
          <entry key="org.jasig.cas.authentication.principal.UsernamePasswordCredentials">
            <bean class="org.jasig.cas.authentication.DirectMappingAuthenticationManagerImpl.DirectAuthenticationHandlerMappingHolder"
                  p:authenticationHandler-ref="ldapHandler"
                  p:credentialsToPrincipalResolver-ref="ldapResolver" />
          </entry>
          <entry key="org.jasig.cas.adaptors.x509.authentication.principal.X509CertificateCredentials">
            <bean class="org.jasig.cas.authentication.DirectMappingAuthenticationManagerImpl.DirectAuthenticationHandlerMappingHolder"
                  p:authenticationHandler-ref="certHandler"
                  p:credentialsToPrincipalResolver-ref="certResolver" />
          </entry>
        </map>
      </property>
    </bean>
    
  • 相关阅读:
    loadrunner-3-19LR常见函数
    loadrunner-3-18Service-Level Agreement(服务水平协议)
    loadrunner-3-15IP欺骗
    loadrunner-3-14集合点
    Python 静态类型检查 mypy 示例
    JavaScript 中 == 和 === 的区别
    Python 一键安装全部依赖包
    TypeError: 'NoneType' object is not subscriptable
    前端开发神器 VSCode 使用总结
    Next.js 配置接口跨域代理转发
  • 原文地址:https://www.cnblogs.com/ssgao/p/8817130.html
Copyright © 2020-2023  润新知