为了账号安全,请及时绑定邮箱和手机立即绑定

【有奖征文】《SSO CAS单点系列》之附加篇 CAS单点登录集成

标签:
Java WebApp

你是技术帝吗? 我不是唉。。。
你是职场狂人吗?我不是唉。。。
如果你有对象的话,赶。。 (阻止) 我没有!
那你凭什么拿红包! 因为我的文章可以让新手直接部署架构体系服务!

看我珍藏版CAS实例
SSO系列专题已经结束了,里面都是下载一些现成的东西,这里教大家不需要编译器,直接模拟多客户端CAS登录。然后为大家奉上一个精确到每一个步骤的详细CAS服务器的环境搭建来完成这一步。当然也打着征文的名号,万一就被选上呢?
q1
1.1.从cas官网下载CAS服务器:cas-server-3.5.1-release.zip和java版客户端cas-client-3.2.1-release.zip。(需要的朋友可以找我要 QQ:87894394 晓枫)
然后复制三个tomcat
q2
2.给hosts文件添加 假信息(此处为了测试)
q3
(注:此处的demo.yansghuai.com 请跟后面的cas姓与名相同)
demo.yangshuai.com  =>> 对应部署cas server的tomcat,这个虚拟域名还用于证书生成
app1.yangshuai.com  =>>  对应部署app1 的tomcat
app2.yangshuai.com   =>> 对应部署app2 的tomcat
3.JDK安装 并配置JAVA_HOME,保持可以直接cmd控制台运行(不是输入运行路径的内种而是直接输入java就会出现相关变量的内种样子)
4.安全证书配置 http://www.micmiu.com/lang/java/keytool-start-guide/(证书使用工具帮助
5.生成证书
按win键+R,弹出运行窗口,输入 cmd 回车,打开命令行窗户,输入如下命令:

keytool -genkey -alias mydemo -keyalg RSA -keysize 1024 -keypass mydemo -validity 365 -keystore e:\CAS\sso\demo.keystore -storepass mydemo

(注意:请在现有磁盘下创建 e:\CAS\sso目录 仅供参考)
q4
(查看证书 MD5指纹等信息请在帮助页查看,上面有网址)
6.导出为证书文件crt

keytool -export -alias mydemo -keystore e:\CAS\sso\demo.keystore -file e:\CAS\sso\demo.crt -storepass mydemo

(优先使用这一句,如果导不出来,请使用下面命令指定命令-rfc导出格式crt然后在导出)

keytool -list -rfc -keystore e:\CAS\sso\demo.keystore -storepass mydemo

q5
7.导出证书(如果上一步骤已经导出,就跳过这一步)
keytool -export -alias mydemo -keystore e:\CAS\sso\demo.keystore -file d:\sso\michael.crt -storepass mydemo
.q6
8.把证书添加到客户端jdk中

keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:\CAS\sso\demo.crt -alias mydemo

(如果路径目录存在空格,请在路径前后加上双引号“””)
cacerts是certified authority certificates的缩写,就是java存放证书的证书库。访问这个文件的默认密码是changeit,要把证书导入到这里时,系统会提示你输入该密码。可以通过下面的命令把cacerts的访问密码改成别的形式,如

password 
keytool -storepasswd -alias casdemo -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass changeit -new password

(此处会让输入keystore密码,如果你输入你之前设置的,然后提示IOE异常的话,就别输入原先设置的密码,而是输入固定密码 changeit,如果想修改密码,请参照上一行)
q7
(到这里证书就完成了开始服务器配置)
9.配置tomcat服务端
下载CAS的服务端,解压,把解压后的文件中modules文件夹中的cas-server-webapp-3.4.8.war文件拷贝的%TOMCAT_HOME%\webapps下,并修改文件名为:cas.war。
q8
q9
然后修改tomcat目录下\conf\server.xml文件去,掉此文件83到93行之间的注释,修改为:
q10
两个密码一致 都是开始设定的 (clientayth=false)

10,启动tomcat 运行 https:\localhost:8080/cas
q11
8443https协议配置完成(这里下了好大的功夫啊)

然后根据第一部设置的host文件来访问http://demo.yangshuai.com:8088/cas出现一下页面(8088是我设置的端口号)
q12
用户名;admin 密码:admin 输入后就会看到下面这个页面
q13
(到了这里就说明你服务端配置完成)
开始tomcat-APP1
q14
http://app1.yangshuai.com:18088/examples/servlets/(这里的地址就是hosts文件的第二个地址 请根据自身情况定制)
(这步操作更改端口是为了一台电脑运行多个tomcat 记住吧8005端口也改掉,如果确定都改了还是不可以的话,请把tomcat分开别再同一目录)

10.配置客户端
看到上述界面表示tomcat-app1的基本安装配置已经成功(tomcat-app2同样如此验证是否成功)。
接下来复制 client的lib包cas-client-core-3.2.1.jar到 tomcat-app1\webapps\examples\WEB-INF\lib\目录下, 在tomcat-app1\webapps\examples\WEB-INF\web.xml 文件中增加如下内容:
添加客户端到你的项目中也就是下载的cas_client
modules文件夹中有需要的jar包,请根据自己的项目情况选择使用,把相应的jar包放到你项目WEB-INF/lib下。
modules文件夹中有需要的jar包,请根据自己的项目情况选择使用,把相应的jar包放到你项目WEB-INF/lib下。
q17
(我也不知道会需要到哪个,所以我只是先把core核心包跟logging日志包拿了过去,剩下的看后面情况而定吧)

11 配置web.xml

<!-- ======================== 单点登录开始 ======================== -->
        <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
        <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>
        </filter>
        <filter-mapping>
            <filter-name>CAS Single Sign Out Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

        <filter>
            <filter-name>CAS Filter</filter-name>
            <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
            <init-param>
                <param-name>casServerLoginUrl</param-name>
                <param-value>https://demo.yangshuai.com:8443/cas/login</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app1.yangshuai.com:18080</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CAS Filter</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>
                <param-name>casServerUrlPrefix</param-name>
                <param-value>https://demo.yangshuai.com:8443/cas</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app1.yansghuai.com:18080</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>

        <!-- ======================== 单点登录结束 ======================== -->

(tomcat-app2同样如此)

  1. 测试验证SSO(这里往下的图片不是亲自截图,来自网络,请注意域名,不要写错)
    启动之前配置好的三个tomcat分别为:tomcat-cas、tomcat-app1、tomcat-app2.
    13  基本的测试
    预期流程: 打开app1 url —-> 跳转cas server 验证 —-> 显示app1的应用 —-> 打开app2 url —-> 显示app2应用 —-> 注销cas server —-> 打开app1/app2 url —-> 重新跳转到cas server 验证.
    打开浏览器地址栏中输入:http://app1.yansghuai.com:18080/examples/servlets/servlet/HelloWorldExample,回车
    q18
    跳转到验证页面:
    q19
    验证通过后显示如下:
    q20
    此时访问app2就不再需要验证:
    q21
    地址栏中输入:https://demo.yangshuai.com:8443/cas/logout,回车显示
    q22
    上述表示 认证注销成功,此时如果再访问 : http://app1.yangshuai.com:18080/examples/servlets/servlet/HelloWorldExamplehttp://app2.yangshuai.com:28080/examples/servlets/servlet/HelloWorldExample 需要重新进行认证。
    (如果出现404之类的东西,请认真看错误信息,可能会是证书密钥不存在,或者说没找到,没导入之类的,请自行搜索删除证书语句,从新生成证书!)

14.获取登录用户信息
修改类:webapps\examples\WEB-INF\classes\HelloWorldExample.java 后重新编译并替换 webapps\examples\WEB-INF\classes\HelloWorldExample.class文件。 (我是用的tomcat自带的项目,所以请根据项目来修改)
修改代码如下:

import java.io.*;
import java.util.*;
import java.util.Map.Entry;

import javax.servlet.*;
import javax.servlet.http.*;

import org.jasig.cas.client.authentication.AttributePrincipal;
import org.jasig.cas.client.util.AbstractCasFilter;
import org.jasig.cas.client.validation.Assertion;

/**
 * CAS simple Servlet
 *
 * @author <a href="http://www.micmiu.com">Michael Sun</a>
 */

public class HelloWorldExample extends HttpServlet {

    private static final long serialVersionUID = -6593274907821061823L;

    @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",
                request.getLocale());
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");

        String title = rb.getString("helloworld.title");

        out.println("<title>" + title + "</title>");
        out.println("</head>");
        out.println("<body bgcolor=\"white\">");

        out.println("<a href=\"../helloworld.html\">");
        out.println("<img src=\"../images/code.gif\" height=24 "
                + "width=24 align=right border=0 alt=\"view code\"></a>");
        out.println("<a href=\"../index.html\">");
        out.println("<img src=\"../images/return.gif\" height=24 "
                + "width=24 align=right border=0 alt=\"return\"></a>");
        out.println("<h1>" + title + "</h1>");

        Assertion assertion = (Assertion) request.getSession().getAttribute(
                AbstractCasFilter.CONST_CAS_ASSERTION);

        if (null != assertion) {
            out.println(" Log  ValidFromDate =:"
                    + assertion.getValidFromDate() + "<br>");
            out.println(" Log  ValidUntilDate =:"
                    + assertion.getValidUntilDate() + "<br>");
            Map<Object, Object> attMap = assertion.getAttributes();
            out.println(" Log  getAttributes Map size = " + attMap.size()
                    + "<br>");
            for (Entry<Object, Object> entry : attMap.entrySet()) {
                out.println("      " + entry.getKey() + "=:"
                        + entry.getValue() + "<br>");
            }
            AttributePrincipal principal = assertion.getPrincipal();

            // AttributePrincipal principal = (AttributePrincipal) request
            // .getUserPrincipal();

            String username = null;
            out.print(" Log  UserName:");
            if (null != principal) {
                username = principal.getName();
                out.println("<span style='color:red;'>" + username
                        + "</span><br>");
            }

        }

        out.println("</body>");
        out.println("</html>");
    }
}

15.再进行上述测试显示结果如下:
http://app1.yangshuai.com:18080/examples/servlets/servlet/HelloWorldExample
q23
http://app2.yangshuai.com:28080/examples/servlets/servlet/HelloWorldExample
q24
从上述页面可以看到通过认证的用户名。
到此已经全部完成了CAS单点登录实例演示。

点击查看更多内容
23人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
455
获赞与收藏
3117

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消