cas学习3:自定义登录页面

cas也搞得差不多了,一直使用的是默认登录页面,这样是肯定不行的,企业级登录页面,一般都是自定义的,页面上有广告或者公司的logo等,
下面开始进行自定义登录页面,查看官方文档,发现有动态主题和静态主题,下面只介绍静态主题模式。
参考文档

https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html#themes
https://apereo.github.io/cas/5.3.x/installation/User-Interface-Customization-Themes.html

主题

主题意味着风格不一样,目的就是不同的接入端,显示不同的登录页面,就像阿里旗下的各种登录,支付宝登录,淘宝,天猫,用的可能就是同一个sso,但是各自的登录主题不一样。
简略看完后,会有以下的规范:
     ● 静态资源(js,css)存放目录为src/main/resources/static
     ● html资源存(thymeleaf)放目录为src/main/resources/templates
     ● 主题配置文件存放在src/main/resources并且命名为[theme_name].properties
     ● 主题页面html存放目录为src/main/resources/templates/

主题的配置

登录页渲染文件为casLoginView.html,还记得我们之前配置客户端注册的时候的json文件,这个文件中还可以添加一个属性theme对应自己的主题,具体看下面的例子,cas也可以设置一个默认主题,如果service注册的时候没有指明主题,就使用默认的主题。

具体操作实战
第一步:在客户端注册的json文件中添加theme属性

客户端app1

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-json">{
  "<span style="color:#50a14f">@class</span>" : <span style="color:#009900 !important">"org.apereo.cas.services.RegexRegisteredService"</span>,
  "<span style="color:#50a14f">serviceId</span>" : <span style="color:#009900 !important">"^(https|imaps|http)://app1.cas.com.*"</span>,
  "<span style="color:#50a14f">name</span>" : <span style="color:#009900 !important">"测试客户端app1"</span>,
  "<span style="color:#50a14f">id</span>" : <span style="color:#006666 !important">1000</span>,
  "<span style="color:#50a14f">description</span>" : <span style="color:#009900 !important">"这是app1的客户端"</span>,
  "<span style="color:#50a14f">evaluationOrder</span>" : <span style="color:#006666 !important">10</span>,
  "<span style="color:#50a14f">theme</span>" : <span style="color:#009900 !important">"app1"</span>
}</code></span></span></span></span>

客户端app2

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-json">{
  "<span style="color:#50a14f">@class</span>" : <span style="color:#009900 !important">"org.apereo.cas.services.RegexRegisteredService"</span>,
  "<span style="color:#50a14f">serviceId</span>" : <span style="color:#009900 !important">"^(https|imaps|http)://app2.cas.com.*"</span>,
  "<span style="color:#50a14f">name</span>" : <span style="color:#009900 !important">"测试客户端app2"</span>,
  "<span style="color:#50a14f">id</span>" : <span style="color:#006666 !important">1001</span>,
  "<span style="color:#50a14f">description</span>" : <span style="color:#009900 !important">"这是app2的客户端"</span>,
  "<span style="color:#50a14f">evaluationOrder</span>" : <span style="color:#006666 !important">11</span>,
  "<span style="color:#50a14f">theme</span>" : <span style="color:#009900 !important">"app2"</span>
}</code></span></span></span></span>
第二步:在src/main/resources下创建app1.properties 和 app2.properties

根据官网文档,需要在src/main/resources文件夹的根目录下创建 与 json文件中theme属性值 对应的properties
所以要在src/main/resources新建app1.properties 和 app2.properties 这只是demo,所以以下内容相似。

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-python"><span style="color:#880000 !important"><em>#原cas默认的css样式,如果更改了,某些页面样式将丢失</em></span>
cas.standard.css.file=/css/cas.css
<span style="color:#880000 !important"><em>#自己的样式</em></span>
cas.myself.css=/themes/app1/css/cas.css
cas.javascript.file=/themes/app1/js/jquery-<span style="color:#006666 !important">1.4</span><span style="color:#006666 !important">.2</span>.min.js
cas.page.title=app1的主题</code></span></span></span></span>

在app1.properties 和 app2.properties 中的属性值都是随便起,只要在html中指明引用的key就可以了,例如:properties中指明css和js文件地址,然后在html中用下面的方式使用。

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-html"><span style="color:#006666 !important"><<span style="color:#4f4f4f !important">link</span> <span style="color:#4f4f4f !important">rel</span>=<span style="color:#009900 !important">"stylesheet"</span> <span style="color:#4f4f4f !important">th:href</span>=<span style="color:#009900 !important">"@{${#themes.code('cas.myself.css')}}"</span>/></span>
<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">script</span> <span style="color:#4f4f4f !important">th:src</span>=<span style="color:#009900 !important">"@{${#themes.code('cas.javascript.file')}}"</span>></span><span style="color:#006666 !important"></<span style="color:#4f4f4f !important">script</span>></span></code></span></span></span></span>

注意:上面配置文件中有cas.standard.css.file属性,这个属性默认就是指向/css/cas.css也就是cas默认的css文件,这个我们要指明,否则你只是自定义了登录页面,其他页面的样式将丢失。我们在自定义的登录页面使用自己的css文件,不跟cas的默认css混淆。

第三步:根据第二步创建cas.css文件

客户端1

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-css"><span style="color:#006666 !important">h2</span> {
    <span style="color:#50a14f">color</span>:<span style="color:#009900 !important"> red</span>;
}</code></span></span></span></span>

客户端2

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-css"><span style="color:#006666 !important">h2</span> {
    <span style="color:#50a14f">color</span>:<span style="color:#009900 !important"> pink</span>;
}</code></span></span></span></span>
第四步:在application.properties中添加以下属性,配置默认主题
<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-python"><span style="color:#880000 !important"><em># 默认主题</em></span>
cas.theme.defaultThemeName=app2</code></span></span></span></span>
  • 1
  • 2
第五步:配置不同客户端的登录页面

这是只给出app1的页面,页面都是一样的,只是根据在properties中的title属性来区分不同的客户端,app2粘贴就行了。
注意要点:from表单的内容需要遵循一定的标准th:object等.

<span style="color:rgba(0, 0, 0, 0.75)"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#f6f8fa"><code class="language-html"><span style="color:#4f4f4f !important"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></span>
<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">html</span>  <span style="color:#4f4f4f !important">xmlns:th</span>=<span style="color:#009900 !important">"http://www.thymeleaf.org"</span>></span>
<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">head</span>></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">meta</span> <span style="color:#4f4f4f !important">http-equiv</span>=<span style="color:#009900 !important">"Content-Type"</span> <span style="color:#4f4f4f !important">content</span>=<span style="color:#009900 !important">"text/html; charset=utf-8"</span> /></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">title</span> <span style="color:#4f4f4f !important">th:text</span>=<span style="color:#009900 !important">"${#themes.code('cas.page.title')}"</span>></span><span style="color:#006666 !important"></<span style="color:#4f4f4f !important">title</span>></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">link</span> <span style="color:#4f4f4f !important">rel</span>=<span style="color:#009900 !important">"stylesheet"</span> <span style="color:#4f4f4f !important">th:href</span>=<span style="color:#009900 !important">"@{${#themes.code('cas.myself.css')}}"</span>/></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">script</span> <span style="color:#4f4f4f !important">th:src</span>=<span style="color:#009900 !important">"@{${#themes.code('cas.javascript.file')}}"</span>></span><span style="color:#006666 !important"></<span style="color:#4f4f4f !important">script</span>></span>
<span style="color:#006666 !important"></<span style="color:#4f4f4f !important">head</span>></span>

<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">body</span>></span>
<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">h2</span> <span style="color:#4f4f4f !important">th:text</span>=<span style="color:#009900 !important">"${#themes.code('cas.page.title')}"</span>></span><span style="color:#006666 !important"></<span style="color:#4f4f4f !important">h2</span>></span>
<span style="color:#006666 !important"><<span style="color:#4f4f4f !important">div</span>></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">form</span> <span style="color:#4f4f4f !important">method</span>=<span style="color:#009900 !important">"post"</span> <span style="color:#4f4f4f !important">th:object</span>=<span style="color:#009900 !important">"${credential}"</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">div</span> <span style="color:#4f4f4f !important">th:if</span>=<span style="color:#009900 !important">"${#fields.hasErrors('*')}"</span>></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">span</span> <span style="color:#4f4f4f !important">th:each</span>=<span style="color:#009900 !important">"err : ${#fields.errors('*')}"</span> <span style="color:#4f4f4f !important">th:utext</span>=<span style="color:#009900 !important">"${err}"</span> <span style="color:#4f4f4f !important">style</span>=<span style="color:#009900 !important">"color: red"</span> /></span>
        <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">div</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">h4</span> <span style="color:#4f4f4f !important">th:utext</span>=<span style="color:#009900 !important">"#{screen.welcome.instructions}"</span>></span><span style="color:#006666 !important"></<span style="color:#4f4f4f !important">h4</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">section</span> <span style="color:#4f4f4f !important">class</span>=<span style="color:#009900 !important">"row"</span>></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">label</span> <span style="color:#4f4f4f !important">for</span>=<span style="color:#009900 !important">"username"</span> <span style="color:#4f4f4f !important">th:utext</span>=<span style="color:#009900 !important">"#{screen.welcome.label.netid}"</span> /></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">div</span> <span style="color:#4f4f4f !important">th:unless</span>=<span style="color:#009900 !important">"${openIdLocalId}"</span>></span>
                <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">class</span>=<span style="color:#009900 !important">"required"</span> <span style="color:#4f4f4f !important">id</span>=<span style="color:#009900 !important">"username"</span> <span style="color:#4f4f4f !important">size</span>=<span style="color:#009900 !important">"25"</span> <span style="color:#4f4f4f !important">tabindex</span>=<span style="color:#009900 !important">"1"</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"text"</span>
                       <span style="color:#4f4f4f !important">th:disabled</span>=<span style="color:#009900 !important">"${guaEnabled}"</span>
                       <span style="color:#4f4f4f !important">th:field</span>=<span style="color:#009900 !important">"*{username}"</span>
                       <span style="color:#4f4f4f !important">th:accesskey</span>=<span style="color:#009900 !important">"#{screen.welcome.label.netid.accesskey}"</span>
                       <span style="color:#4f4f4f !important">autocomplete</span>=<span style="color:#009900 !important">"off"</span>
                       <span style="color:#4f4f4f !important">th:value</span>=<span style="color:#009900 !important">"admin"</span> /></span>
            <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">div</span>></span>
        <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">section</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">section</span> <span style="color:#4f4f4f !important">class</span>=<span style="color:#009900 !important">"row"</span>></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">label</span> <span style="color:#4f4f4f !important">for</span>=<span style="color:#009900 !important">"password"</span> <span style="color:#4f4f4f !important">th:utext</span>=<span style="color:#009900 !important">"#{screen.welcome.label.password}"</span>/></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">div</span>></span>
                <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">class</span>=<span style="color:#009900 !important">"required"</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"password"</span> <span style="color:#4f4f4f !important">id</span>=<span style="color:#009900 !important">"password"</span> <span style="color:#4f4f4f !important">size</span>=<span style="color:#009900 !important">"25"</span> <span style="color:#4f4f4f !important">tabindex</span>=<span style="color:#009900 !important">"2"</span>
                       <span style="color:#4f4f4f !important">th:accesskey</span>=<span style="color:#009900 !important">"#{screen.welcome.label.password.accesskey}"</span>
                       <span style="color:#4f4f4f !important">th:field</span>=<span style="color:#009900 !important">"*{password}"</span>
                       <span style="color:#4f4f4f !important">autocomplete</span>=<span style="color:#009900 !important">"off"</span>
                       <span style="color:#4f4f4f !important">th:value</span>=<span style="color:#009900 !important">"123456"</span> /></span>
            <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">div</span>></span>
        <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">section</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">section</span>></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"hidden"</span> <span style="color:#4f4f4f !important">name</span>=<span style="color:#009900 !important">"execution"</span> <span style="color:#4f4f4f !important">th:value</span>=<span style="color:#009900 !important">"${flowExecutionKey}"</span> /></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"hidden"</span> <span style="color:#4f4f4f !important">name</span>=<span style="color:#009900 !important">"_eventId"</span> <span style="color:#4f4f4f !important">value</span>=<span style="color:#009900 !important">"submit"</span> /></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"hidden"</span> <span style="color:#4f4f4f !important">name</span>=<span style="color:#009900 !important">"geolocation"</span> /></span>
            <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">input</span> <span style="color:#4f4f4f !important">class</span>=<span style="color:#009900 !important">"btn btn-submit btn-block"</span> <span style="color:#4f4f4f !important">name</span>=<span style="color:#009900 !important">"submit"</span> <span style="color:#4f4f4f !important">accesskey</span>=<span style="color:#009900 !important">"l"</span> <span style="color:#4f4f4f !important">th:value</span>=<span style="color:#009900 !important">"#{screen.welcome.button.login}"</span> <span style="color:#4f4f4f !important">tabindex</span>=<span style="color:#009900 !important">"6"</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"submit"</span> /></span>
        <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">section</span>></span>
    <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">form</span>></span>
<span style="color:#006666 !important"></<span style="color:#4f4f4f !important">div</span>></span>
<span style="color:#006666 !important"></<span style="color:#4f4f4f !important">body</span>></span>
<span style="color:#006666 !important"></<span style="color:#4f4f4f !important">html</span>></span></code></span></span></span></span>
搭建完成之后的目录图如下:

这里写图片描述

测试

第一步:先直接登录cas服务,默认使用的是app2的主题
第二步:访问app1.cas.com客户端1 显示客户端1的主题。
第三步:访问app2.cas.com客户端2 显示客户端2的主题。
第四步:登录 登出测试 没有问题。效果如下图:
这里写图片描述

这是我自己参考做出来的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Apereo CAS 5.2.3服务器端进行增量开发并自定义登录页面、添加验证码、注册和修改功能,可以按照以下步骤进行操作: 1. 下载并安装Apereo CAS 5.2.3服务器端,确保服务器环境和依赖项已正确配置。 2. 创建自定义登录页:在CAS服务器的webapp目录中创建一个新的文件夹,例如customlogin,然后在该文件夹中创建一个HTML文件,可以命名为login.html。在该文件中编写自定义登录页面,包括用户名和密码输入框和提交按钮等。 3. 更新CAS配置文件:在CAS服务器的/etc/cas目录下找到配置文件cas.properties,找到并修改以下两个属性: cas.login.viewResolver.basename=/customlogin cas.login.viewResolver.suffix=.html 将上述两行配置添加到配置文件中,并设置自定义登录页路径的前缀和后缀。 4. 添加验证码功能:可以使用各种验证码库,如Kaptcha或Google的reCAPTCHA来实现验证码功能。将所选库的相关文件和配置添加到CAS服务器的相应目录中。然后,将验证码相关的代码添加到自定义登录页面中,例如在登录表单中添加一个验证码输入框。 5. 实现注册和修改功能:首先,在CAS服务器的webapp目录中创建一个新的文件夹,例如user,用于处理注册和修改相关的请求。然后,创建相应的HTML文件用于显示注册和修改表单,以及处理相关请求的后端代码。 6. 更新CAS配置文件:在cas.properties中添加以下配置: cas.logout.success.url=/user/logout.html 这将重定向用户到自定义的登出页面。 7. 编写后端代码:在新创建的user目录中编写处理注册和修改相关请求的后端代码,包括验证表单数据和将数据保存到数据库等操作。 8. 部署和测试:将CAS服务器重新启动,并使用浏览器访问自定义登录页面,尝试登录、注册和修改等操作,确保功能正常运行。 请注意,上述步骤仅提供了一个概述,并且可能需要根据具体需求进行适当的修改和调整。此外,CAS的版本升级可能会对上述步骤产生影响,因此建议在实施前先了解相关的CAS文档和社区讨论。 ### 回答2: 首先,在Apereo CAS 5.2.3服务器端进行增量开发时,需要了解CAS的整体架构和登录流程。CAS使用Spring Security作为身份验证和授权框架,因此我们可以通过自定义Spring Security的配置来实现自定义登录页、增加验证码、注册和修改功能。 1. 自定义登录页: 创建一个自定义的登录页,可以通过使用CAS的主题功能来实现。CAS的主题功能允许我们定义自己的视图和控制器。可以在CAS配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_login_view cas.viewResolver.​custom_login_view​=classpath:/templates/custom_login_view.html ``` 在该配置中,我们将自定义的登录页命名为`custom_login_view`,并将其路径设置为`classpath:/templates/custom_login_view.html`。 2. 增加验证码: 为了增加验证码功能,我们可以使用Spring Security的表单登录配置。可以在CAS的配置文件中添加如下配置: ```properties cas.authn.​attributeRepository​[0]=org.apereo.cas.authentication.attribute.DefaultAttributeDefinitionStore cas.authn.​attributeRepository​[0].attributes​=attributeName:value ``` 在该配置中,我们可以将自定义的属性添加到登录表单中,例如`attributeName`和`value`。 3. 注册功能: 如果想要在CAS中添加注册功能,可以使用自定义的服务注册表来实现。可以创建自定义的注册控制器和视图,并在CAS的配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_register_view cas.viewResolver.​custom_register_view​=classpath:/templates/custom_register_view.html ``` 在自定义的注册视图中,可以添加表单输入字段以收集用户注册信息。然后可以在自定义的注册控制器中处理该表单的提交,将用户信息存储到数据库或其他持久化层。 4. 修改功能: 要实现修改功能,可以使用CAS提供的扩展点和API来自定义修改逻辑。可以创建自定义的修改控制器和视图,并在CAS的配置文件中进行如下配置: ```properties cas.viewResolver.viewNames[0]=custom_modify_view cas.viewResolver.​custom_modify_view​=classpath:/templates/custom_modify_view.html ``` 在自定义的修改视图中,可以添加表单输入字段以收集用户修改信息。然后可以在自定义的修改控制器中处理该表单的提交,更新用户信息。 通过以上步骤,可以在Apereo CAS 5.2.3服务器端实现自定义登录页、增加验证码、注册和修改功能。需要注意的是,以上示例仅提供了一种实现方式,具体的实现方式可能因项目需求和环境而有所不同。 ### 回答3: 首先,为了进行apereo CAS 5.2.3 server的增量开发,我们需要确保已经成功安装了CAS server并进行了基本配置。接下来,我们将手把手教你如何自定义登录页,增加验证码以及实现注册和修改功能。 1. 自定义登录页: - 在CAS server的配置文件中,找到`cas.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`cas.properties`文件,找到`cas.viewResolver`属性并设置为`default`。 - 在`/etc/cas/config/views/`目录下创建自定义登录页的模板文件,例如`login.jsp`。 - 在`login.jsp`中进行自定义设计,并保存文件。 - 在CAS server的`WebContent`目录下找到`WEB-INF/web.xml`文件,并将其中的`welcome-file`设置为`login.jsp`。 - 重新启动CAS server,自定义登录页将会生效。 2. 增加验证码: - 在CAS server的配置文件中,找到`application.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`application.properties`文件,找到验证码相关的属性,并进行相应的配置,例如启用验证码、验证码长度,以及验证码的字体、颜色等。 - 在CAS server的`WebContent`目录下找到`WEB-INF/web.xml`文件,添加验证码相关的过滤器配置。 - 在自定义登录页的表单中,添加一个验证码输入框,并在表单提交时进行验证码的验证。 - 重新启动CAS server,验证码将会在登录时显示并进行验证。 3. 实现注册和修改功能: - 在CAS server中创建一个自定义的注册和修改模块,可以基于现有的模块进行扩展或自行开发。 - 在CAS server的配置文件中,找到`cas.properties`文件,并将其复制到`/etc/cas/config/`目录中。 - 打开复制后的`cas.properties`文件,找到`cas.authn.accept.users`属性并添加一个用于注册和修改的用户类型。 - 在注册和修改模块中,实现相应的业务逻辑,例如验证用户输入、更新用户信息等。 - 在自定义登录页中添加注册和修改的链接,并配置相应的路径。 - 重新启动CAS server,注册和修改功能将会生效。 以上就是手把手教你如何在apereo CAS 5.2.3 server上进行增量开发,包括自定义登录页、增加验证码以及实现注册和修改功能的步骤。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值