【环境说明】
本案例演示过程在同一个机器上的3个tomcat服务器上,环境如下:
-
windows10 64位
-
jdk1.7.0_80
-
apache-tomcat-7.0.82-windows-x64
-
cas-server-webapp-4.0.0.war、cas-client-core-3.2.1.jar、commons-logging.jar
-
确保本地jdk环境已经搭建好,JAVA_HOME环境变量配置完毕。
有关cas概念请使用TP(传送)cas-sso单点登录理论 详细了解,我就不赘述了。
一.修改hosts文件
1.编辑C:\Windows\System32\drivers\etc\hosts 添加如下3条信息
127.0.0.1 server.zhy94.com ---对应cas-server服务器部署域名 127.0.0.1 client1.zhy94.com --对应web应用1服务器部署域名 127.0.0.1 client2.zhy94.com --对应web应用2服务器部署域名
二.配置安全证书
1.cmd打开命令窗口
2.使用如下命令生成证书
keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass zhy123 -validity 365 -keystore c:\zhy.keystore -storepass
zhy123
-alias后面的别名可以自定义,-keypass指定证书密钥库的密码, -storepass和前面keypass密码相同,否则下面tomcat 配置https 会访问失败
-keystore指定证书的位置,
这里指定放在c盘根目录,密钥库名称可以自定义,这里文件名为zhy.keystore
重:名字与姓氏这一选项应与之前hosts文件上的cas-server域名一直
3.导出证书
keytool -export -alias ssodemo -keystore c:\zhy.keystore -file c:\ssodemo.crt -storepass zhy123
-alias后面的名称要与生成证书的命令里面的alias的名称一致. –keystore后面指定证书存放的位置,这里我放在C盘根目录,
同时证书名称要与【生成证书】对应的命令里的keystore名称一致.这里是zhy.keystore,-file后面才crt路径,我也指定在c盘根目录.
–storepass的证书密码要与上面输入的密码一致.检查c盘下是否存在该证书 ssodemo.crt
4.使该证书导入jdk证书库,命令窗进入jdk下的如下路径
cd C:\Program Files\Java\jdk1.7.0_80\jre\lib\security
必须进入该文件夹,然后再执行下面的命令
keytool -import -alias ssodemo -file c:\ssodemo.crt -keystore cacerts -trustcacerts
5.如果原来有证书需要更新则
keytool -list -keystore cacerts
keytool -delete -alias akazam_email -keystore cacerts
命令窗进入jdk目录下的证书路径,即C:\Program Files\Java\jdk1.7.0_80\jre\lib\security
keytool -import -alias ssodemo -file c:\ssodemo.crt -keystore cacerts -trustcacerts
3.部署CAS-Server服务器
<!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->
将注释去掉,并修改为
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="C:/zhy.keystore" keystorePass="zhy123" clientAuth="false" sslProtocol="TLS" />
其中keystoreFile 为证书位置,keystorePass为刚刚设置的密码,这两项一定要与前面一致
2.验证https的可用性
进入tomcat如下路径:D:\User\ProgramFile\tomcat7\bin
执行startup.bat脚本,然后登陆https://server.zhy94.com:8443/cas/login,首先应为https链接有风险,点击高级选项,继续访问
应该进入tomcat的主页
4.部署CAS-Server
CAS-Server 下载地址: http://www.jasig.org/cas/download
也可以去我的CSDN地址直接下载war包 (赚点积分,多多见谅):cas-server-webapp-4.0.0.war
下载的文件应为:cas-server-4.0.0-release.zip 解压后为:cas-server-4.0.0,进入改路径下的modules文件夹,找到
cas-server-webapp-4.0.0.war,将该文件重命名为cas.war,并放入D:\User\ProgramFile\tomcat7\webapps下,然后调用
D:\User\ProgramFile\tomcat7\bin下的startup.bat脚本启动tomcat,war包就会自动解压为cas项目。然后访问如下链接
https://server.zhy94.com:8443/cas/login 进入cas登陆验证界面。如下图示
点击上图标志按钮可变为中文(i18n)
至于用户名密码在D:\User\ProgramFile\tomcat7\webapps\cas\WEB-INF 下的deployerConfigContext.xml文件中
找到
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler"> <property name="users"> <map> <entry key="casuser" value="Mellon"/> </map> </property> </bean>
其中key为账户,value为密码(应该和我的一样,放心直接登陆吧)。
但是,肯定有人问用户名密码一定需要存入数据库吧,所以下面实在数据库设置账户密码的方法。
数据库设置账户密码:
1.添加jar包
数据库使用的为:mysql
cas作为一个webapp已经部署了,但是他没有访问数据库的jar包,就需要我们手动给他加入啦
为cas项目(路径为:D:\User\ProgramFile\tomcat7\webapps\cas\WEB-INF\lib)
WEB-INF下lib下添加如下三个jar包
c3p0-0.9.1.2.jar、cas-server-support-jdbc-4.0.0.jar、mysql-connector-java-5.1.13-bin.jar
下载地址(赚点积分,多谢打赏):jar包下载
2.修改cas配置文件,以方便支持数据库认证。
编辑D:\User\ProgramFile\tomcat7\webapps\cas\WEB-INF下的deployerConfigContext.xml
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager"> <constructor-arg> <map> <!-- | IMPORTANT | Every handler requires a unique name. | If more than one instance of the same handler class is configured, you must explicitly | set its name to something other than its default name (typically the simple class name). --> <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" /> <!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />--> <!-- key-ref指定自己的本地数据库访问 --> <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/> </map> </constructor-arg>
按照我上图的处理方式处理,注释掉<!--<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->
添加<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
并在该文件添加数据库的bean如下
<!-- 指定c3p0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/webitma?useUnicode=true&characterEncoding=UTF-8" /> <property name="user" value="root" /> <property name="password" value="123" /> </bean> <!-- 访问本地数据库 --> <bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" p:dataSource-ref="dataSource" p:sql="SELECT u.`password` FROM `sec_user` u WHERE u.`account` = ?" />
其中sql语句可换为任何一张本地(自定义)用户表和任何字段。所以下面就是你建表配置数据库啦~!看清上面的jdbcUrl别和我的一样
,你连不上我的数据库,那 太正常了~!
5.部署web应用,实现单点登录
<h1>This is casClient1~~~~~~!...........king of the world</h1>
以区分casClient1和即将部署的casClient2
然后修改casClient1 下的web.xml,添加下面的filter,大家仔细观看下面的配置,其中servName(有两个,都要改)
写的是:http://client1.zhy94.com:9090,所以等会部署的时候端口要写9090了
(同时记住,你刚刚部署cas-server的tomcat窗口不要关,关了谁帮你验证啊?),
继续写8080,会个部署cas-server的tomcat服务器发生端口冲突。
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置--> <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://server.zhy94.com:8443/cas/login</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://client1.zhy94.com:9090</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.Cas10TicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://server.zhy94.com:8443/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://client1.zhy94.com: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>,接下来就是激动人心的IDEA启动该项目实现CAS---SSO单点登陆的时刻啦~!
六,最终实现
访问:http://client1.zhy94.com:9090/casClient1/index.jsp
就会自动跳转到:
https://server.zhy94.com:8443/cas/login?service=http%3A%2F%2Fclient1.zhy94.com%3A9090%2FcasClient1%2Findex.jsp
如下图所示:
之后输入你在数据库设计的账户密码就好了,登陆结果如下图:
成功访问,然后如法炮制另一个javaweb项目。并启动,直接访问
之后会出现登陆成功界面,这就表示cas-server已经部署成功,我们需要在另外两台服务器上写两个项目然后利用cas进行验证。
http://client2.zhy94.com:8989/casClient2/index.jsp,就会无需验证,直接访问到casClient2的index.jsp页面啦~!
想重复实现,只要用浏览器清除Cookie就好了~!
到此为止~!IDEA -CAS -SSO单点登录实现啦~!菜鸟一枚多多见谅。
本文大片抄袭,呸~!是引用了另外一个大拿的文章传送门在此传送门。(本片文章所有资源下载共需9个积分,实在没有的话请联系本人QQ:583760722(最好自己下,我想赚点积分啦,知识无价,友谊长存啊~!))。