集成了客户端之后往往会有一些定制化的需求,比如登录界面。
根据cas官方的文档,我们可以灵活的自定义模板或者主题,具体做法是复制一份templates并重命名后放到templates文件夹下,总感觉哪里怪怪的,为什么不是default文件夹,为什么不是平级的……
好吧,懒得研究了,所以我直接去修改了templates文件夹下的html文件,这是简单便捷的方式,恢复也很简单,做个备份就好。
一般来说修改 casLoginView.html、casLogoutView.html、casGenericSuccessView.html这几个文件就已经满足我们的需求了,当然你也可以把所有的全部改掉,像casAccountDisabledView.html就是当账号被禁用时显示的页面,注意里面动态标记的内容不要去碰(尤其是login form,其他内容如果不需要可以删除),样式可以随意更改。
这里有个小小的国际化问题,中文内容如果直接写入这些html页面是会显示出乱码的,原因就是这些html其实是被当成模板加载到web容器的,不是直接调用,有2个办法,1个是官方推荐的在messages_zh_CN.properties这些资源文件中定义你的资源字符串,维护英语和中文就够了;另一个办法就是在页面中写js脚本,用脚本的方式替换资源字符串。
$('#sp').text('\u91cd\u65b0\u767b\u5f55');
自定义过滤器,由于DotNet平台下过滤器工作原理和API比较独特,因此DotNet平台下自定义过滤很简单,只需要自己控制基于form的验证即可,你可以利用web.config控制allow、deny,也可以在代码里监测identity然后根据需要强制跳转到登录页面。
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);
Response.Write(ticket.UserData + "<br />");
}
else
{
CasAuthentication.RedirectToLoginPage();
}
Java平台下,在web.xml配置项的CAS Authentication Filter下,配置ignorePattern和ignoreUrlPatternType。
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://sso.xxx.com/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>https://sso.xxx.com</param-value>
</init-param>
<init-param>
<param-name>ignorePattern</param-name>
<param-value>css</param-value>
</init-param>
<init-param>
<param-name>ignoreUrlPatternType</param-name>
<param-value>CONTAINS</param-value>
</init-param>
</filter>
上文我们将静态资源样式表排除出验证对象,官方预置了EXACT、CONTAINS、 REGEX(默认)三种模板。
如果,这三种都无法满足我们,那么就需要自己写过滤类了,建立一个空库,引入cas-client-core引用,新建一个类扩展UrlPatternMatcherStrategy接口,把自己的逻辑写进去即可。
private String pattern;
@Override
public boolean matches(String url) {
boolean ret = url.contains(pattern);
return ret;
}
@Override
public void setPattern(String str) {
pattern = str;
}
这段代码实现的正是官方的CONTAINS。