①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳✕✓✔✖
./gradlew listTemplateViews
support/cas-server-support-thymeleaf
在这个目录中保存了准备制作的各类模板文件。 cas-templates
具体操作如下:
重点:
创建一个外部文件夹/home/fanhl/01-java/cas/cas-templates/src
,将 templates、css、js、imgs 都放在这里,这样不用重启服务,也可以改变User Interface
└── src├── static│ └── wukong│ ├── css│ ├── favicon.ico│ ├── images│ ├── js│ └── yn.jpg├── templates│ └── themes│ └── wukong│ └── login│ └── casLoginView.html└── wukong.properties
yn.jpg
is a test image.
建立这个文件:resources/services/web-10000001.json
{"@class": "org.apereo.cas.services.RegexRegisteredService","serviceId": "^(https|imaps|http)://.*","name": "web","id": 10000001,"evaluationOrder": 10,"accessStrategy": {"@class": "org.apereo.cas.services.DefaultRegisteredServiceAccessStrategy","enabled": true,"ssoEnabled": true},"theme": "wukong"}
注意:"theme": "wukong"
配置application.yml
cas:service-registry:json:location: classpath:/serviceswatcher-enabled: trueauthn:accept:users: user::aaaview:template-prefixes:- file:/home/fanhl/01-java/cas/cas-templates/src/templates/spring:thymeleaf:cache: falseweb:resources:static-locations:- classpath:/static/- file:/home/fanhl/01-java/cas/cas-templates/src/static/
注意:
template-prefixes
static-locations
- classpath:/static/
wukong.properties
cas.standard.css.file=/css/cas.css
如果不配置这个文件或者文件为空,那么新的样式不能显示。
也可以做一个软连接配置文件,将模板文件中的内容链接过来。
[cas-templates ]
工程下有一个wukong.properties
可以软连接过来
## 进入当前目录 cas-overelay/src/main/resourcesln -s /home/fanhl/01-java/cas/cas-templates/src/wukong.properties ./
有如下类的代码可以读一下,为了跟踪下面的类与代码,需要添加依赖。
implementation "org.apereo.cas:cas-server-support-thymeleaf"
CasThymeleafConfiguration
// 这里有一点小问题,要加上themes,那么在template中也要加上这个目录。val templatePrefixes = casProperties.getView().getTemplatePrefixes();theme.setPrefix(viewPath + "themes/%s/");
ThemeFileTemplateResolver
上面是模板解析类,继承了thymeleaf
的FileTemplateResolver
类。
通过代码可以看到:如果有themeName
,那么就拼接这个模板文件。如果没有直接调用父类的computeTemplateResource
函数。
@Overrideprotected ITemplateResource computeTemplateResource(final IEngineConfiguration configuration, final String ownerTemplate,final String template, final String resourceName, final String characterEncoding,final Map<String, Object> templateResolutionAttributes) {val request = HttpRequestUtils.getHttpServletRequestFromRequestAttributes();val themeName = this.themeResolver.resolveThemeName(request);if (StringUtils.isNotBlank(themeName)) {val themeTemplate = String.format(resourceName, themeName);LOGGER.trace("Computing template resource [{}]...", themeTemplate);return super.computeTemplateResource(configuration, ownerTemplate, template,themeTemplate, characterEncoding, templateResolutionAttributes);}return super.computeTemplateResource(configuration, ownerTemplate, template,resourceName, characterEncoding, templateResolutionAttributes);}
参看文档
通过ThemeResolver
,就可以得到当前的theme
,ThemeResolver
有两个方法:
resolveThemeName
:从当前请求中解析出主题的名字。解析模板用setThemeName
:设置当前主题。 当某个 client 访问时,发现设置了theme
时候用。cas-server-support-themes-collection
官方给的一个例子,代码在这里
这个例子给出了一个思路,今后可以把内容打包到一个 Jar 包,发布出去。
具体使用的步骤如下:
implementation "org.apereo.cas:cas-server-support-themes-collection"
官方提供了:example、twbs
"theme": "example"
然后启动程序后,就能看到新的样式了。
在 css 中使用了 import
@import '../../../css/cas.css';body {background-color: rgb(12, 71, 112);}body,p,span,div,a,h1,h2,h3,h4,h5,h6 {font-family: Bookerly, Tahoma;}
example.properties
例子
cas.theme.name=Example Themecas.theme.description=Example - Central Authentication Servicecas.standard.css.file=/themes/example/css/cas.csscas.standard.js.file=/themes/example/js/cas.jscas.logo.file=/themes/example/images/logo.pngcas.favicon.file=/themes/example/images/favicon.icocas.drawer-menu.enabled=falsecas.notifications-menu.enabled=falsecas.login-form.enabled=true