Apereo CAS 爬坑

心血来潮想给公司搭个单点登录系统,毕竟内网这么多系统,每个系统都一套账号密码,这样好low。CAS提供了一个统一认证服务,所有系统直接向CAS去请求登陆认证,而用户只在CAS登陆一次就够了,在大一点的公司里基本都有这种服务,叫SSO(Single sign-on)。
找了找开源的SSO,看到了CAS,感觉挺屌的,一直在更新,就他了。然后就开始爬坑了,记录一下,免得日后忘了又爬一次。

CAS-Overlay-Template

这个项目很大,还需要很多自定义配置,所以不可能做成开箱即用。CAS-Overlay-Template 就是一个模板项目,clone下来, 修改配置,然后是直接跑还是打包war或者打包docker都好说。
新版本的 CAS-Overlay-Template 已经改为Gradle编译,我喜欢Gradle。
clone下来后,直接 先运行
./build.sh copy
再运行
./build.sh run
就跑起来了。

编译配置

跑起来个屁。
默认是CAS 6.0版本,直接用Java11了,要跑6.0版本先去装个jdk11,配好环境。我踩坑的时候6.0还是RC版本,发现有bug就还是滚回5.3.5,配置这些东西在gradle.properties

# Versions
cas.version=5.3.5  // 可以改成6.0.0-rc3
springBootVersion=2.1.0.RELEASE

appServer=-tomcat

gradleVersion=4.10.2
tomcatVersion=9
tomcatFullVersion=9.0.12

group=你的组织名
sourceCompatibility=8   // 6.0以上就改成11
targetCompatibility=8    // 6.0以上就改成11

# Location of the downloaded CAS shell JAR
shellDir=build/libs

# use without "-slim" in tag name if you want tools like jstack, adds about 100MB to image size
baseDockerImage=openjdk:8-slim   // 6.0以上就改成11

同时,还有增加几个依赖,因为CAS完全是插件化设计

    compile "org.apereo.cas:cas-server-support-jdbc:${casServerVersion}"
    compile "org.apereo.cas:cas-server-support-jdbc-drivers:${casServerVersion}"
    compile "org.apereo.cas:cas-server-support-pm:${casServerVersion}"
    compile "org.apereo.cas:cas-server-support-pm-jdbc:${casServerVersion}"

然后下1个小时依赖就可以跑起来了,可喜可贺,可喜可贺。

配置目录

680540-aceedb0145819cc8.png
image.png

这个目录,里面包含了所有的配置,基本上改这里面的东西就够了。

这个配置目录是如何生效的?

之所以先运行 ./build.sh copy 是因为

function copy() {
    echo -e "Creating configuration directory under /etc/cas"
    mkdir -p /etc/cas/config

    echo -e "Copying configuration files from etc/cas to /etc/cas"
    cp -rfv ./etc/cas/* /etc/cas
}

他会把配置文件复制进系统配置目录,然后 Springboot 启动后会去读这个系统配置目录。
另外,注意一下 src/main/jib/docker/entrypoint.sh 里面是类似 Dockerfile

#!/bin/sh

#echo -e "\nChecking java..."
#java -version

#echo -e "\nCreating CAS configuration directories..."
mkdir -p /etc/cas/config
mkdir -p /etc/cas/services

#echo "Listing provided CAS docker artifacts..."
#ls -R docker/cas

#echo -e "\nMoving CAS configuration artifacts..."
mv docker/cas/thekeystore /etc/cas 2>/dev/null
mv docker/cas/config/*.* /etc/cas/config 2>/dev/null
mv docker/cas/services/*.* /etc/cas/services 2>/dev/null

#echo -e "\nListing CAS configuration under /etc/cas..."
#ls -R /etc/cas

echo -e "\nRunning CAS..."
exec java -Xms512m -Xmx2048M -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -jar docker/cas/war/sso.war

打包镜像时,也会直接把配置目录复制进镜像的系统配置目录

build.sh

常用操作 build.sh 都已经写好了,常用的比如

  • ./build.sh copy 复制配置到系统目录
  • ./build.sh run 运行CAS
  • ./build.sh docker 打包镜像
  • ./build.sh debug Debug CAS

配置

然后几乎所有的服务配置都在 cas/config/cas.properties
一点一点的补充吧,把example.com换成自己的域名。
下面是 5.3.5的配置,5.2.x 的配置不一样,6.0.0也不一样,文档没写,我也不写?。
后文会介绍怎么去源码看当前版本的配置项

服务地址

cas.server.name=http://sso.example.com
cas.server.prefix=${cas.server.name}    //要使用根Path访问,比如 http://sso.example.com 就这样。默认值是`${cas.server.name}/cas`
server.context-path=      //对,就是空,这样就可以使用根Path访问了,默认值是 /cas
server.port=443    // HTTPS的端口,默认8443
cas.server.http.enabled=true    // 开启HTTP,默认只有HTTPS,而且我只知道怎么开HTTP,不知道怎么关HTTPS
cas.server.http.port=80  // 设置HTTP端口,默认8080

上面这几个配置挺操蛋的,我以为 cas.server.prefix 改了就可以 http://sso.example.com 直接访问了,结果还是要加上/cas才能访问,这个配置是假的,只是用于各种重定向url填充用。server.context-path 才是真正的 Path。

数据库认证

cas.authn.accept.users=        // 留空才会禁用 Static Authentication
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].url=jdbc:mysql://xxxxxxxxxxxxxxxx?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=xxxxxxx
cas.authn.jdbc.query[0].password=xxxxxxxxx
cas.authn.jdbc.query[0].sql=select * from user where name=?

// 这些配置懒得讲了,网上大部分文章讲的都没问题
cas.authn.jdbc.query[0].fieldPassword=password    
cas.authn.jdbc.query[0].fieldExpired=expired
cas.authn.jdbc.query[0].fieldDisabled=disabled
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

配置数据库认证很简单。去给数据库建个表。填一下字段名和Sql,就可以了。然后跑一下试试吧

密码管理-邮件

CAS支持密码管理功能,直接网页上点忘记密码,就给你邮箱发重置邮件,配置比较多,坑也很多

# 发送邮件,我用的腾讯企业邮
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.username=xxxxxx@example.com
spring.mail.password=xxxxxxx

# 这是腾讯企业邮的配置,其他邮箱自己配,可能有些坑,但这个不管CAS的事
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
spring.mail.properties.mail.smtp.ssl=true

密码管理-数据库

改改自己的SQL就好了

cas.authn.pm.enabled=true    // 开启修改密码功能
cas.authn.pm.autoLogin=true  // 修改密码后自动登录
cas.authn.pm.jdbc.autocommit=true  // 加就是了
cas.authn.pm.jdbc.sqlFindEmail=SELECT email FROM user WHERE name=?
cas.authn.pm.jdbc.sqlChangePassword=UPDATE user SET password=? WHERE name=?
cas.authn.pm.jdbc.url=${cas.authn.jdbc.query[0].url}
cas.authn.pm.jdbc.user=${cas.authn.jdbc.query[0].user}
cas.authn.pm.jdbc.password=${cas.authn.jdbc.query[0].password}
cas.authn.pm.jdbc.dialect=${cas.authn.jdbc.query[0].dialect}
cas.authn.pm.jdbc.driverClass=${cas.authn.jdbc.query[0].driverClass}
# 密码修改加密规则,这个必须要和原始密码加密规则一致
cas.authn.pm.jdbc.passwordEncoder.type=${cas.authn.jdbc.query[0].passwordEncoder.type}
cas.authn.pm.jdbc.passwordEncoder.characterEncoding=${cas.authn.jdbc.query[0].passwordEncoder.characterEncoding}
cas.authn.pm.jdbc.passwordEncoder.encodingAlgorithm=${cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm}
cas.authn.pm.jdbc.passwordEncoder.secret=${cas.authn.jdbc.query[0].passwordEncoder.secret}

密码管理-业务配置

cas.authn.pm.reset.mail.from=${spring.mail.username}
cas.authn.pm.reset.mail.subject=[XXX公司 SSO系统] 重置密码
# 邮件内容,必须要有%s,因为会生成一个连接并且带了token,否则无法打开链接,当然这个链接也和cas.server.prefix有关系
cas.authn.pm.reset.mail.text=[季诺科技 SSO]打开以下链接重置您的密码,10分钟后失效: %s
cas.authn.pm.reset.expirationMinutes=10  // 邮件有效期
cas.authn.pm.reset.securityQuestionsEnabled=false    // 问题验证,我觉得这个操作很蠢,就关了
# 8-32位,必须包含大小写字母,数字,字符。你可以填其他密码检验正则
cas.authn.pm.policyPattern=^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,32}

神坑

路由转发环境下的IP校验

到这里可能本地跑起来没问题了,修改密码都正常。一部署到线上就不能修改密码,从邮箱验证链接点过去,CAS每次都拒绝此次密码修改请求。为啥?
翻了大片的源码,终于找到了原因。邮箱里收到的链接参数是加了密的,取消加密的话就很容易看出问题。

http://sso.example.com/login?pswdrst={"jti":"ad06632d-dcee-43e0-bf0f-639150912b96","iss":"http://sso.example.com","aud":"http://sso.example.com","exp":1542541827,"iat":1542541227,"origin":"17*.17*.0.11","client":"1*.1*.97.138","sub":"jude"}

token里包含了请求邮件验证时的客户端IP,也不知道为啥,Nginx转发后,他拿到的IP就老是不对,点击链接访问时,IP对不上他就不认这次请求。
普通的直接部署的CAS系统,不加这个没问题。但我们的内网环境是有一台Nginx路由,所有请求都会经过他转发,就出问题。
差点去改源码了,好在无聊翻源码时找到,CAS原来留了一手来处理这个问题。

cas.audit.alternateClientAddrHeaderName=X-Forwarded-For

添加这个配置, CAS就会从Header里读X-Forwarded-For来确认客户端IP,这样就不存在转发后IP不对的问题了。

6.0版本的密码修改BUG

我也不清楚6.0版本加了找回用户名这个积累功能后,为啥找回密码页面他老是发请求到找回用户名的接口上去。导致找回密码和找回用户名2个功能都不能正常工作。源码好多,对JSP无力,没细查,改回5.3.5,BUG消失,放弃6.0。

找配置文档

我上面的配置有很多,官网文档写的很糟,又少又老还跳来跳去,还每个版本都要改配置项(5.2.x, 5.3.x, 6.0.x都很多不一样)。
网上大部分文档都是5.2版本的祖传配置,一开始真是恶心死我了。
还是得自己去翻源码,先找到 CasServerProperties 这个类,他在

680540-0e7ac366e2eec2d3.png
image.png

这个类就是配置的映射,还有少数注释讲了很多官方文档没说的操作。
680540-bc48e6681f290af5.png
image.png

照着这个类来填配置就行了。

弃坑

好不容易终于跑起来这个坑B玩意了,但十分不建议使用CAS,CAS优势是开放,适合二次开发。
但十分难用......去用keycloak吧。配置简单,界面还好看。

### 回答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、付费专栏及课程。

余额充值