最近有朋友在使用cas,但是项目并没有使用maven管理,需要从官网源码改造一份非maven版的cas-server。下面是我改造后的项目。
本次修改简单介绍:
1、修改https方式为http,主要是本地测试,没想使用证书。修改部分有标注,可以按照官网源码恢复。
2、修改认证方式为数据库。添加jdbc配置,dataSource配置。其中把认证的sql抽出来作为配置项:cas.query.user=select password from t_user where username=?
3、调整log级别为debug。
有需要的朋友配置下自己的数据源,启动服务就可以访问cas-server了。
#client#
另外,我新建了两个client用于测试,查看sso效果,这期间遇到一个奇葩的需求。朋友需要在cas-client项目中拦截一部分,其余部分不拦截,本来是一个简单的需求,但是由于历史原因,项目没有规划好路径,要拦截的路径很多很零碎,不拦截的路径有一个统一入口,在配置cas拦截url-pattern时,没办法配置(路径基本是各种各样,如果配置进去要把每一个路径放进去,一来配置项太长,二来以后没法维护了,而且没人愿意一个一个去找路径)。
既然如此,就配置url-pattern 为 /*, 只要把不拦截的配置进去,不就简单了吗。可惜的是cas并没有提供这种方式(这其实是对的,因为你配置的路径就是要被拦截的,不配置就不拦截。之所以我朋友这里这么麻烦,还不是因为垃圾设计导致的奇葩现象。)。
为此,考虑扩展client端的filter,提供一个excludes配置项,用于反其道而行之。
查看源码,找到client端配置的拦截器AuthenticationFilter,添加 private String excludes = "/admin/"; private final String exclude_splitter = ";"; 以及setter和对应的源码修改,大家懂得。记得把修改后的AuthenticationFilter,在项目的src目录下存放,package为原来的package org.jasig.cas.client.authentication; 当然你也可以修改源码,打包一个jar,但是不利于以后升级。
最后认证拦截器配置为:
<bean name="authenticationFilter"
class="org.jasig.cas.client.authentication.AuthenticationFilter">
<property name="casServerLoginUrl" value="${cas.server.loginUrl}" />
<property name="renew" value="${cas.server.renew}" />
<property name="gateway" value="${cas.server.gateway}" />
<property name="service" value="${cas.client.serverName}" />
<property name="excludes" value="${cas.client.excludes}"></property>
</bean>
下载地址cas-client
启动cas-server,cas-client, cas-client2,访问下任何一个client,不仅能实现sso,而且实现了excludes 一些path。 - _ -