一、CAS是什么?

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

CAS特点

1、开源的企业级单点登录解决方案。
2、CAS Server 为需要独立部署的 Web 应用。(CAS代码请跟售后服务人员获取)
3、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

CAS时序图

CAS原理和协议

从结构上看,CAS 包含两个部分:CAS Server 和 CAS Client。
1.CAS Server 需要独立部署,主要负责对用户的认证工作;
2.CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图 是 CAS 最基本的协议过程:

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket

如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。

用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,

之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),

CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。

二、平台如何配置和使用统一认证集成组件?

本组件支持对接已有的 CAS认证服务、OAuth认证服务。

je-web 配置修改

pom增加依赖

<!-- JEPaaS Auth -->
        <dependency>
            <groupId>com.je</groupId>
            <artifactId>je-plugin-cas-client</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.je</groupId>
            <artifactId>je-plugin-oauth-client</artifactId>
            <version>1.0.0</version>
        </dependency>

web.xml修改

配置统一认证Filter

    <!-- 统一认证过滤器 -->
    <filter>
        <filter-name>authFilter</filter-name>
        <filter-class>com.je.auth.core.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>authFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

cas.xml

resources/xxx 目录下新建文件

<?xml version="1.0" encoding="UTF-8"?>
<cas>
    <!--
        不指定前缀的参数如 casServerUrlPrefix ,所有的 filter 都可以使用;
        使用如下前缀可以为指定Filter配置参数
        singleSignOutFilter ==> SingleSignOutFilter,
        authenticationFilter ==> AuthenticationFilter,
        validationFilter ==> Cas30ProxyReceivingTicketValidationFilter

        如:<authenticationFilter.serverName>http://127.0.0.1:8080</authenticationFilter.serverName>
           可以向 authenticationFilter 中添加name为 serverName 的init-param。
    -->

    <!-- 本应用地址 -->
    <serverName>http://127.0.0.1:8080</serverName>
    <!-- cas服务地址 -->
    <casServerUrlPrefix>https://cas.example.org:8443/cas</casServerUrlPrefix>
    <!-- cas服务登录地址 -->
    <casServerLoginUrl>https://cas.example.org:8443/cas/login</casServerLoginUrl>
    <!-- cas服务退出登录地址 -->
    <casServerLogoutUrl>https://cas.example.org:8443/cas/logout</casServerLogoutUrl>

    <!-- Cas30ProxyReceivingTicketValidationFilter 相关配置-->
    <redirectAfterValidation>true</redirectAfterValidation>
    <useSession>true</useSession>
    <authn_method>mfa-duo</authn_method>

    <!-- 已使用 security-url.xml 替代 -->
    <except-security-url/>

</cas>

自定义代码

CAS

CAS 基于 cas-client-core 标准CAS进行拓展。

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.6.2</version>
</dependency>

je-plugin-cas-client 默认使用 Assertion.getPrincipal().getName(作为USERCODE查找JEPaaS用户。如果想修改条件可以实现 CasAuthInfoParse 接口, 如下示例。

@Service
public class CasAuthInfoParseDemo implements CasAuthInfoParse {

    @Autowired
    private MetaService metaService;

    /**
     * cas信息作为USERID查找本系统用户
     *
     * @param assertion cas认证信息
     * @return 本系统用户信息
     */
    @Override
    public DynaBean parse(Assertion assertion) {
        String userId = assertion.getPrincipal().getName();
        List<DynaBean> users = metaService.select("JE_CORE_ENDUSER",
                ConditionsWrapper.builder(" USERID = {0}", userId));

        return users.get(0);
    }
}

如果使用了非标准CAS或二次修改过的CAS认证服务,并且CAS认证服务提供了自己的 client jar包,这种情况可以使用 JE_AUTH_CAS_FILTER_CLASS JE_AUTH_CAS_FILTER_PARAMS 两个变量配置上 client jar中的 Filter类 和相关参数(详见系统变量),配置完成将不会使用 je-plugin-cas-client 而是使用自己的 CAS client。

OAuth

OAuth需要自定义代码才可以使用,实现 OAuth2Service 接口, userId(OAuthConfig authConfig, String code, Map<String, String[]> params) 方法。userId 方法会将 OAuth回调认证码 以及 OAuth配置信息 作为入参传入,方法中自行调用OAuth认证服务获取用户信息,返回值为JEPaaS用户ID。


@Service
public class OAuth2ServiceImpl implements OAuth2Service {


    /**
     * 根据认证信息获取用户主键
     *
     * @param authConfig OAuth配置信息
     * @param code       OAuth回调返回的预授权码
     * @param params     回调返回的所有参数
     * @return java.lang.String
     */
    @Override
    public String userId(OAuthConfig authConfig, String code, Map<String, String[]> params) {
        return null;
    }

}

系统变量

通用

变量编码 变量名称 说明
JE_AUTH_TYPE 统一认证模式 值为(CAS/OAuth2),表示当前使用的CAS认证还是OAuth认证
JE_AUTH_INDEX 配置主页地址 http://127.0.0.1:1120/index.html
JE_AUTH_LOGIN 配置登录页地址 http://127.0.0.1:1120/login.html
JE_AUTH_RETAIN_LOGIN 保留系统登录 值(0/1), 默认为0。当开启CAS或OAuth后,默认进入认证服务的登录页,通过此变量可保留系统原有登录

OAuth2

变量编码 变量名称 说明
JE_OAUTH2_ID OAuthAppId OAuth认证服务提供的客户端标识
JE_OAUTH2_SECRET AppSecret OAuth认证服务提供的客户端密钥
JE_OAUTH2_OTHER_CONFIG 拓展配置 JSON格式。一些OAuth服务需要的其他配置,通过 OAuthConfig.getOtherConfig()获取。(OAuthConfig在OAuth自定义代码部分)
JE_OAUTH2_ACCESS_TOKEN_URL 获取AccessToken接口 OAuth认证服务接口。后端通过 OAuthConfig获取。
JE_OAUTH2_USER_URL 用户身份验证接口 通过回调code与AccessToken获取用户身份的接口。后端通过 OAuthConfig获取。
JE_OAUTH2_CALLBACK 获取AccessToken接口 OAuth回调地址,在JE_OAUTH2_REDIRECT_URL的变量会用到。例如 http://127.0.0.1:8080/oauth2_callback
JE_OAUTH2_REDIRECT_URL 统一认证地址 OAuth的登录页地址。可使用变量有 callbackUr(JEPaaS接收OAuth回调信息的地址)、appId(OAuthAppId)、state(JEPaaS状态码),这些变量后端会替换为具体值。 例如 https://oauth.com/login?redirect_uri={callbackUrl}&app_id={appId}&state={state}
JE_AUTH_OAUTH2_MODIFY_URL 修改密码 OAuth修改密码地址,配置后在JEPaaS右上角点击修改密码,会进入OAuth修改密码地址。
JE_AUTH_OAUTH2_LOGOUT_URL 退出地址 OAuth退出登录地址,配置后在JEPaaS右上角点击退出登录,会退出JEPaaS 然后跳转到OAuth退出登录地址。
JE_AUTH_OAUTH2_FILTER_CLASS 自定义的OAuthFilter 填写全类名,如com.custom.filter.XXXFilter。使用此配置后je-plugin-oauth-client插件将无效
JE_AUTH_OAUTH2_FILTER_PARAMS 自定义Filter配置 JSON格式。代码中将以 FilterConfig 的形式传入Filter的init方法中

CAS

变量编码 变量名称 说明
JE_AUTH_CAS_MODIFY_URL 修改密码 CAS修改密码地址,配置后在JEPaaS右上角点击修改密码,会进入CAS修改密码地址。
JE_AUTH_CAS_LOGOUT_URL 退出地址 CAS退出登录地址,配置后在JEPaaS右上角点击退出登录,会退出JEPaaS 然后跳转到CAS退出登录地址。支持使用indexUrl变量,值为JEPaaS首页地址,如 https://cas.example.org:8443/cas/logout?logoutRedirectUrl={indexUrl
JE_AUTH_CAS_FILTER_CLASS 自定义的Filter 填写全类名,如com.custom.filter.XXXFilter。使用此配置后je-plugin-cas-client插件将无效
JE_AUTH_CAS_FILTER_PARAMS 自定义Filter配置 JSON格式。代码中将以 FilterConfig 的形式传入Filter的init方法中
最后编辑: 肖海杰  文档更新时间: 2024-08-21 10:58   作者:呼丽华