CAS:一、初次client端接入

一、前言

    近期,公司项目要与外公司项目对接;外公司CAS服务端项目,本公司业务系统作为client端(Struts2+spring+ibatis)接入。由于,现在是演练阶段,我提前学习下CAS server端与client端接入流程,并记录下来;以免以后再次淌坑。

    以本公司业务系统client端(Struts2+spring+ibatis)为基础演练;cas-client-core-3.4.1.jar被放在了WEB-INF/lib/下。

二、软件准备

1.cas server下载地址:https://github.com/apereo/cas . 在releases选项卡中,可以找到各种版本。

 

 

2.cas client,可以去https://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core 下载,我选用的是3.4.1。

3.cas-server-4.0.0解压后如图,去modules包下找到cas-server-webapp-4.0.0.war,可以改名为cas.war,放在tomcat/webapps下,启动服务端。

4.关闭服务端tomcat,要做几处修改如下:

  • 新增账号/密码,或者可以用默认的casuser:Mellon

  • 修改tomcat启动端口不介绍了;直说cas有一个配置。

  • 本地测试,不需要配置域名映射或Nginx代理。稍后会说道。
  • 去除CAS的https认证。添加一个属性设置p:requireSecure="false"。默认为true,需要安全验证,使用的是https协议。

  • 在登录页面,注释HTTPS提醒

  • 启动tomcat,访问cas

三、client配置

1.之前说过,cas-client-core-3.4.1.jar被放在了WEB-INF/lib/下。

2.web.xml,

  • cas的filter必须放在struts2 filter前方。
  • ignorePattern:表示请求过滤白名单,只能是"正则表达式";但是,我尝试了另一种正则,反而会影响"拦截效果";就这种管用。(在这里感谢https://blog.csdn.net/eguid_1/article/details/73611781的作者)
  • serverName:写域名或者IP:端口号;再拼接别的没用,我试过了;项目的ContextPath是cas server自动拼接的,如:我的serverName=http://localhost:9090,正常登陆后,自动回调为http://localhost:9090/idauth
  • 单点退出功能还未实现。注意:在加入SingleSignOutFilter时,一定要配置casServerUrlPrefix,不然无法启动成功(╮(╯▽╰)╭ 我就遇到了,百思不得其解)。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!--单点退出配置的目的是在CAS server回调所有的application 进行单点登出操作的时候,需要这个Filter来实现session 清除。-->
    <!-- 用於单点退出,该过滤器用于实现单点登出功能,可选配置 -->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <!--${casServerUrlPrefix}serviceValidate 注意${casServerUrlPrefix}的value的末尾"/"-->
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:2020/cas/</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!-- 该过滤器负责用户的认证工作,必须启用它 -->
    <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://localhost:2020/cas/login</param-value>
            <!--这里的server是服务端的IP -->
        </init-param>
        <init-param>
            <!--cas服务端回调配置-->
            <param-name>serverName</param-name>
            <param-value>http://localhost:9090</param-value>
        </init-param>
        <init-param>
            <description>不拦截的请求</description>
            <param-name>ignorePattern</param-name>
            <param-value>/*.js|/*.css|/*.jpg|/*.png|/*.gif|/*.htm</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CASFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <!--${casServerUrlPrefix}serviceValidate 注意${casServerUrlPrefix}的value的末尾"/"-->
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:2020/cas/</param-value>
        </init-param>
        <init-param>
            <!--cas服务端回调配置-->
            <param-name>serverName</param-name>
            <param-value>http://localhost:9090</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>
            org.jasig.cas.client.util.HttpServletRequestWrapperFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <filter>
        <filter-name>Paramcheck</filter-name>
        <filter-class>base.web.filter.Paramcheck</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Paramcheck</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

<!-- 后续省略 -->

3.获取登录参数

        Assertion assertion = AssertionHolder.getAssertion();
        //其他属性
        Map<String, Object> attrMap = assertion.getAttributes();
        //登录账号
        AttributePrincipal principal = assertion.getPrincipal();

        String account = principal.getName();
        String attrJson = JSON.toJSONString(attrMap);

        log.warn(">>>> account:" + account);
        log.warn(">>>> attrJson:" + attrJson);

四、待续

  • cas server--登录验证策略实现
  • cas server--登录成功后,自定义返回参数
  • cas server--登录首页改造
  • cas server--单点退出功能

五、参考文献

https://blog.csdn.net/dongdong_java/article/details/22293377/

https://blog.csdn.net/wuzhong8809/article/details/84032196

https://www.cnblogs.com/yft-javaNotes/p/10645023.html

https://blog.csdn.net/eguid_1/article/details/73611781

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章