cas5.1.x版本主题界面自定义

一、cas自定义主题界面使用场景

  项目在集成了单点登录CAS后,往往CAS的登录界面是不满足项目需求的,并且不同系统接入CAS后,登录界面也是不同的。因此,我们需要对CAS登录界面进行自定义。

二、相关规范

  官方文档:https://apereo.github.io/cas/5.1.x/installation/User-Interface-Customization.html, 通过阅读官方文档,大致包含以下规范:

  1. 主题命名规范
      在src/main/resources/services目录下存放主题的json配置文件,配置文件的命名必须是{name}-{id}.json,id必须为json文件内容id一致的这种方式,不然找不到配置文件。json文件中相关参数配置说明如下:
参数名称 说明
@class 必须为org.apereo.cas.services.RegisteredService的实现类,对其他属性进行一个json反射对象,常用的有RegexRegisteredService,匹配策略为id的正则表达式
serviceId 表示哪一个网站使用这个模板
name 服务名称,会显示在默认登录页
id 主题id,全局唯一标识,需与文件名中${id}保持一致
description 服务描述,会显示在默认登录页
evaluationOrder 匹配争取时的执行循序(越小越优先)
theme 主题名称,建议与文件名${name}保持一致
attributeReleasePolicy cas参数返回策略,在多参数返回时需要配置这个属性
proxyPolicy 使用cas代理模式需要配置这个属性
logoutUrl cas单点退出服务端向客户端的这个地址发送退出通知
  1. 其他配置文件
目录 说明 规范
src/main/resources/static 静态资源存放目录(js,css) {name}/css/{name}.css,{name}/js/{name}.js
src/main/resources/templates html资源存放目录,默认使用thymeleaf ${name}/casLoginView.html
src/main/resources 主题配置文件存放目录 ${name}.properties

三、CAS主题界面加载流程

主题加载流程

四、项目实战

  1. 完整项目截图


    项目截图
  2. services目录配置

  我的services目录中一共配置了三个主题,这里拿demo-10000002.json做讲解,这里{name}=demo,{id}=10000002

{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId": "^(https|imaps|http)://.*",
  "name": "本地服务",
  "id": 10000002,
  "description": "这是一个本地允许的服务,通过localhost访问都允许通过",
  "evaluationOrder": 1,
  "theme":"demo",
  "attributeReleasePolicy": {
    "@class": "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
  },
  "proxyPolicy": {
    "@class": "org.apereo.cas.services.RegexMatchingRegisteredServiceProxyPolicy",
    "pattern": "^(https|http)?://.*"
  },
  "logoutUrl": "http://localhost:8080/"
}

  1. 样式文件

  在src\main\resources\static\themes\demo\css下建立demo.css样式文件

h1 {
    color: blue;
}
  1. 配置文件

  在src\main\resources新建demo.properties文件

demo.css.file=/themes/demo/css/demo.css
demo.pageTitle=demo

standard.custom.css.file=/css/cas.css
admin.custom.css.file=/css/admin.css
cas.javascript.file=/js/cas.js
  1. 登录页

  在src/main/resources/templates/demo下新建casLoginView.html文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title th:text="${#themes.code('demo.pageTitle')}"></title>
    <link rel="stylesheet" th:href="@{${#themes.code('demo.css.file')}}"/>
</head>
<body>
<h1 th:text="${#themes.code('demo.pageTitle')}"></h1>
<div>
    <form method="post" th:object="${credential}">
        <div th:if="${#fields.hasErrors('*')}">
            <span th:each="err : ${#fields.errors('*')}" th:utext="${err}"/>
        </div>
        <h2 th:utext="#{screen.welcome.instructions}"></h2>
        <section class="row">
            <label for="username" th:utext="#{screen.welcome.label.netid}"/>
            <div th:unless="${openIdLocalId}">
                <input class="required"
                       id="username"
                       size="25"
                       tabindex="1"
                       type="text"
                       th:disabled="${guaEnabled}"
                       th:field="*{username}"
                       th:accesskey="#{screen.welcome.label.netid.accesskey}"
                       autocomplete="off"/>
            </div>
        </section>
        <section class="row">
            <label for="password" th:utext="#{screen.welcome.label.password}"/>
            <div>
                <input class="required"
                       type="password"
                       id="password"
                       size="25"
                       tabindex="2"
                       th:accesskey="#{screen.welcome.label.password.accesskey}"
                       th:field="*{password}"
                       autocomplete="off"/>
            </div>
        </section>
        <section class="row">
            <label for="system" >系统</label>
            <div>
                <select class="required"
                        id="system"
                        tabindex="2"
                        th:accesskey="#{screen.welcome.label.password.accesskey}"
                        th:field="*{system}"
                        autocomplete="off">
                    <option value="sso">SSO</option>
                    <option value="oa">OA</option>
                    <option value="crm">CRM</option>
                </select>
            </div>
        </section>
        <section>
            <input type="hidden" name="execution" th:value="${flowExecutionKey}"/>
            <input type="hidden" name="_eventId" value="submit"/>
            <input type="hidden" name="geolocation"/>
            <input class="btn btn-submit btn-block"
                   name="submit"
                   accesskey="l"
                   th:value="#{screen.welcome.button.login}"
                   tabindex="6"
                   type="submit"/>
        </section>
    </form>
</div>
</body>
</html>
  1. 登录效果


    登录效果

五、修改默认主题页

  经过Google,找到两种修改默认主题页的方法

  1. 参数配置
#设置默认主题
cas.theme.defaultThemeName=10000002

10000002对应的是主题的id(全局唯一标识)。但是cas版本5.1.x不支持默认主题目录(application.properties配置了cas.theme.defaultThemeName不会加载主题目录下src/main/resources/templates/[theme_id]/casLoginView.html文件),解决办法:覆盖src/main/resources/templatescasLoginView.html文件

  1. 覆盖webflow文件夹,指定登录页的名称

(1)复制overlays下的webflow文件到resource目录下


webflow目录

(2)修改login-webflow.xml文件,修改view的名称(登录页名)


修改默认登录页

(3)在src/main/resources/templates下新增myLoginView.html登录页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • jHipster - 微服务搭建 CC_简书[https://www.jianshu.com/u/be0d56c4...
    quanjj阅读 800评论 0 2
  • 一、产品概述 雪球网上线于2011年11月1日,网站自身的slogan为“聪明的投资者都在这里”,公司对自身的定位...
    blacknaoh阅读 1,611评论 0 7
  • 以为今天会过得和平常一样,百无聊赖毫无新意。再这样过两天,熬到周五晚上就可以看《春娇救志明》了。 看看段子码码字,...
    益阳高圆圆阅读 630评论 0 0
  • 霜冷长河天破晓,鸡鸣小巷角催人。 旌旗楼上遥招手,欲唤苏郎入酒门。
    莫愁Jessie阅读 385评论 10 11