cas4.2.7实现单点登陆
一、搭建cas服务
下载cas-overlay 项目导入编译器,pom.xml 引入 cas-server-webapp jar (版本请根据你项目实际情况)将项目目录etc下的文件cas.properties 文件复制到项目的WEB-INF目录下
在target 目录下找到文件 spring-configuration,unused-spring-configuration,view,webflow,cas-servlet.xml,deployerConfigContext.xml 文件复制到 项目WEB-INF下
将项目文件中的文件propertyFileConfigurer.xml 文件中 location属性文件cas.properties路径改成你当前项目文件路径
替换原始的页面样式 在cas-server.xml 中 bean id为urlBasedViewResolver的 p:prefix 属性做修改
<bean id="urlBasedViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"
p:viewClass="org.springframework.web.servlet.view.InternalResourceView"
p:prefix="${cas.themeResolver.pathprefix:/WEB-INF/view/jsp}/"
p:suffix=".jsp"
p:order="2000"/>
${cas.themeResolver.pathprefix } 具体路径可以在cas.properties 中找对应的属性名 做修改
cas4.2.7 取消https
cas.properties 文件找 tgc.secure 和 warn.cookie.secure 修改为了false
找到文件HTTPSandIMAPS-10000001.json 在serviceId 中体检http的验证
如使用原始 casLoginView.jsp 在文件中注释掉提示代码
链接数据库
如需链接数据验证登陆信息 在文件 deployerConfigContext.xml 找到 bean name=‘dataSource’
添加链接数库信息
在cas.properties 中添加响应的链接信息 注意 项目中需要添加响应的数据库包
注释掉原来的acceptUsersAuthenticationHandler配置
<alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />
密码加密项配置(例 MD5)
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
<bean id="queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="passwordEncoder" ref="MD5PasswordEncoder" />
</bean>
sql 信息修改 在cas.proerties 中 修改配置 cas.jdbc.authn.query.sql 添加队形的sql
cas.jdbc.authn.query.sql=select password from t_user where account=?
sql 中具体字段自定义,只要时根据账号查询出密码就成
一、搭建cas客户端
客户端只需要修改引入响应的cas客户端的jar包 在web.xml 中添加客户端配置(本例按照web.xml)说明
<!-- ****************** 单点登录开始 ********************-->
<!-- 用于实现单点登出功能 可选 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8080/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>
<!--casServerLoginUrl:cas服务的登陆url -->
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:8080/cas/login</param-value>
</init-param>
<init-param>
<!--serverName:本项目的地址 -->
<param-name>serverName</param-name>
<param-value>http://localhost:8081</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</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>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8080/cas/</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8081</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<!-- 对项目中的哪些路径做登录拦截-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名,可选 -->
<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()。
这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息 -->
<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>
<!-- ****************** 单点登录结束 ********************-->
我在项目开发过程中遇到一个坑点 就是每次登陆成功后 点击客户端,又回到了登陆界面,查看后台日志,发现 在进行客户端回调服务端的验证中心时,找不到验证中心的映射路径,查看源码后映射路径是有的
很奇怪,折腾了好久也不行,最后本人的处理方式是
继承源码,在服务端重新添加回调验证的映射路径
步骤:
1 找到文件applicationContext.xml 发下 在 id为handlerMappingC 的bean 中又配置映射路径的信息,因此在这个bean 中添加一个新的映射 为我的客户端回调映射 并添加我的心的Controller 类
MyServiceValidateController
MyServiceValidateController 类中继承AbstractController 重写方法handleRequestInternal
在handleRequestInternal 中的逻辑和源码中的handleRequestInternal 中的逻辑一样 只是在源码中的handleRequestInternal 直接调用的父级的方法(handleRequestInternal) 我们可以直接看父级的代码
可以直接复制父级的代码到我新的Controller 中
完事后,重启服务 登陆成功后,点击客户端,可以直接正常访问。