统一身份认证安装文档
2023年1月13日大约 7 分钟
统一身份认证安装文档
引言
统一身份认证服务核心是单点登录和单点退出,即'一处登录''处处登录','一处、退出''处处退出',该系统是基于开源框架CAS,CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,本系统采用CAS6.3版本,支持以下功能:
- 可插拔身份验证支持(LDAP、 数据库、X.509、SPNEGO、 JAAS、JWT、 RADIUS、MongoDb等);
- 支持多种协议(CAS、SAML、WS-Federation、 OAuth2、OpenID、OpenID Connect、REST);
- 跨平台客户端支持(Java、.Net、PHP、Perl、Apache) 等。
编写目的
本文档旨在帮助研发人员、测试人员及实施人员快速部署统一身份认证服务。
安装环境
| 分类 | 名称 | 版本 |
|---|---|---|
| 运行平台 | Window/linux | 暂无限制 |
| 缓存 | REDIS | 3.2.12 及以上 |
| 数据库 | Mysql | 8.0.21及以上 |
| 运行环境 | JDK | 11及以上 |
| 服务器 | TOMCAT | 9.0 |
支持协议 http/https
修改配置文件
- 设置数据库-用于用户登录时修改登录数据,账号注册数据源。
使用解压工具打开文件cas.war(不是解压,文件修改完成后拖回压缩包), cas.war\WEB-INF\classes\db.setting
数据库地址
url = jdbc:mysql://10.10.10.102:3306/diboot_cloud_example?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
# 用户名,此处也可以使用 user 代替
username = root
# 密码,此处也可以使用 pass 代替
password = simayi@123
# JDBC驱动名,可选(Hutool会自动识别)
driver = com.mysql.cj.jdbc.Driver
## 可选配置
# 是否在日志中显示执行的SQL
showSql = true
# 是否格式化显示的SQL
formatSql = false
# 是否显示SQL参数
showParams = true- 设置发送邮箱信息-用户找回密码、账号注册;
使用解压工具打开文件cas.war(不是解压,文件修改完成后拖回压缩包), cas.war\WEB-INF\classes\ mail.setting
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.feishu.cn
# 邮件服务器的SMTP端口,可选,默认25
port = 465
# 发件人(必须正确,否则发送失败)
from = cs@cdsimayi.com.cn
# 用户名,默认为发件人邮箱前缀
user = cs@cdsimayi.com.cn
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
pass = Ph5QM0oGs4BILhXK
# 使用SSL安全连接
sslEnable = true- 设置application.properties; 使用解压工具打开文件cas.war(不是解压,文件修改完成后拖回压缩包), cas.war\WEB-INF\classes\application.properties;
# CAS https配置
#证书地址
server.ssl.key-store=file:/etc/cas/thekeystore
#设定访问key store的密码
server.ssl.key-store-password=changeit
#访问key store中key的密码
server.ssl.key-password=changeit
#是否开启https
server.ssl.enabled=false
##
# CAS 服务配置信息
#服务端口
server.port=8014
#服务上下文
server.servlet.context-path=/cas
#请求头大小
server.max-http-header-size=2097152
#处理X-Forwarded- *标头的策略
server.forward-headers-strategy=NATIVE
#
server.error.include-stacktrace=ALWAYS
#是否启用响应压缩
server.compression.enabled=true
#以逗号分隔的应压缩的MIME类型列表
server.compression.mime-types=application/javascript,application/json,application/xml,text/html,text/xml,text/plain
##
# CAS 服务tomcat配置
#
#任何HTTP发布请求中表单内容的最大大小
server.tomcat.max-http-form-post-size=2097152
# Tomcat基本目录。如果未指定,则使用一个临时目录
server.tomcat.basedir=build/tomcat
#连接器在接受连接后将等待呈现请求URI行的时间
server.tomcat.connection-timeout=PT20S
#启用访问日志
server.tomcat.accesslog.enabled=true
#访问日志的格式模
server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
#日志文件名后缀
server.tomcat.accesslog.suffix=.log
#调用backgroundProcess方法之间的延迟。如果未指定持续时间后缀,则将使用秒
server.tomcat.background-processor-delay=0s
#最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.threads.min-spare=10
#最大工作线程数,默认200。(4核8g内存,线程数经验值800,操作系统做线程之间的切换调度是有#系统开销的,所以不是越多越好
server.tomcat.threads.max=200
server.tomcat.remoteip.port-header=X-Forwarded-Port
server.tomcat.remoteip.protocol-header=X-Forwarded-Proto
server.tomcat.remoteip.protocol-header-https-value=https
server.tomcat.remoteip.remote-ip-header=X-FORWARDED-FOR
server.tomcat.uri-encoding=UTF-8
server.tomcat.additional-tld-skip-patterns=*.jar
##
# CAS JMX
#JVM监控
spring.jmx.enabled=false
##
# CAS http编码
#
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
##
# Allow configuration 允许classes目录覆盖jar中bean
#
spring.main.allow-bean-definition-overriding=true
spring.main.lazy-initialization=false
##
# CAS spring cloud配置
#
spring.cloud.bus.enabled=false
spring.cloud.config.allow-override=true
spring.cloud.config.override-system-properties=false
spring.cloud.config.override-none=false
# spring.cloud.bus.refresh.enabled=true
# spring.cloud.bus.env.enabled=true
# spring.cloud.bus.destination=CasCloudBus
# spring.cloud.bus.ack.enabled=true
##
# CAS Web Application Endpoints Security
#
management.endpoints.enabled-by-default=false
management.endpoint.shutdown.enabled=false
management.endpoint.restart.enabled=false
management.endpoints.web.base-path=/actuator
management.endpoints.web.exposure.include=info,health,status,configurationMetadata
management.endpoints.jmx.exposure.exclude=*
# management.endpoints.web.exposure.include=*
# management.endpoints.web.path-mapping.health=status
# management.endpoint.health.show-details=when_authorized
management.server.add-application-context-header=false
# Endpoint Security Basic Authentication
spring.security.user.name=casuser
# spring.security.user.password=
# spring.security.user.roles=
# Define a CAS-specific "WARN" status code and its order
management.endpoint.health.status.order=WARN,DOWN,OUT_OF_SERVICE,UNKNOWN,UP
# Define health indicator behavior (requires cas-server-core-monitor)
management.health.memoryHealthIndicator.enabled=true
# Define a default that doesn't require module /cas/actuator/health/ping serves as status
management.health.ping.enabled=true
# turn off health indicators by default
management.health.defaults.enabled=false
spring.cloud.discovery.client.composite-indicator.enabled=false
##
# CAS Web Application Session Configuration
#
server.servlet.session.timeout=PT30S
server.servlet.session.cookie.http-only=true
server.servlet.session.tracking-modes=COOKIE
##
# CAS Thymeleaf View Configuration
#
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=true
spring.thymeleaf.mode=HTML
spring.thymeleaf.template-resolver-order=100
##
# CAS Log4j Configuration
#
# logging.config=file:/etc/cas/log4j2.xml
server.servlet.context-parameters.isLog4jAutoInitializationDisabled=true
##
# CAS Metrics Configuration
#
management.metrics.web.server.request.autotime.enabled=true
management.metrics.export.atlas.enabled=false
management.metrics.export.datadog.enabled=false
management.metrics.export.ganglia.enabled=false
management.metrics.export.graphite.enabled=false
management.metrics.export.influx.enabled=false
management.metrics.export.jmx.enabled=false
management.metrics.export.newrelic.enabled=false
management.metrics.export.prometheus.enabled=false
management.metrics.export.signalfx.enabled=false
management.metrics.export.statsd.enabled=false
management.metrics.export.wavefront.enabled=false
management.metrics.export.simple.enabled=true
management.metrics.enable.logback=true
management.metrics.enable.process.files=true
management.metrics.enable.system.cpu=true
management.metrics.enable.process.cpu=true
management.metrics.enable.process.uptime=true
management.metrics.enable.process.start.time=true
##
# CAS Swagger Configuration
#
springdoc.show-actuator=true
springdoc.model-and-view-allowed=true
springdoc.writer-with-default-pretty-printer=true
springdoc.swagger-ui.displayRequestDuration=true
##
# CAS AspectJ Configuration
#
spring.aop.auto=true
spring.aop.proxy-target-class=true
##
# CAS View Settings
#
cas.view.cas2.v3ForwardCompatible=true
##
# CAS Authentication Credentials
#
cas.authn.accept.enabled=false
#cas.authn.accept.users=casuser::Mellon
#cas.authn.accept.name=Static Credentials
##
# 数据库配置
##
#显示sql
cas.jdbc.show-sql=true
#配置数据库连接
cas.authn.jdbc.query\[0\].url=jdbc:mysql://10.10.10.102:3306/diboot_cloud_example?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#cas.authn.jdbc.query\[0\].url=jdbc:mysql://10.10.10.102:3306/simayi_cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库方言
cas.authn.jdbc.query\[0\].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.jdbc.query\[0\].user=root
#数据库密码
cas.authn.jdbc.query\[0\].password=simayi@123
#mysql驱动
cas.authn.jdbc.query\[0\].driverClass=com.mysql.cj.jdbc.Driver
#添加jdbc认证
cas.authn.jdbc.query\[0\].sql=select A.auth_secret,A.auth_account,B.qq,B.phone,B.email,B.sfzjh,B.xm,B.status from sys_base_account A LEFT JOIN sys_base_user B ON A.user_id=B.id where A.auth_account=?
#账号状态字段
cas.authn.jdbc.query\[0\].fieldDisabled=status
#密码字段
cas.authn.jdbc.query\[0\].field-password=auth_secret
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
#添加返回字段
cas.authn.jdbc.query\[0\].principalAttributeList=auth_account,qq,email,sfzjh,xm
#开启http服务认证(http-false/https-true)
cas.tgc.secure=false
cas.tgc.max-age=3600
cas.tgc.name=TGC
cas.tgc.path=/
cas.tgc.auto-configure-cookie-path=true
cas.tgc.pin-to-session=true
cas.tgc.remember-me-max-age=P14D
cas.sso.allow-missing-service-parameter=true
cas.sso.create-sso-cookie-on-renew-authn=true
cas.sso.proxy-authn-enabled=true
cas.sso.renew-authn-enabled=true
cas.sso.sso-enabled=true
#cas.serviceRegistry.initFromJson=true
#服务jpa配置
cas.serviceRegistry.jpa.user=$\{cas.authn.jdbc.query\[0\].user\}
cas.serviceRegistry.jpa.password=$\{cas.authn.jdbc.query\[0\].password\}
cas.serviceRegistry.jpa.driverClass=$\{cas.authn.jdbc.query\[0\].driverClass\}
cas.serviceRegistry.jpa.url=$\{cas.authn.jdbc.query\[0\].url\}
cas.serviceRegistry.jpa.dialect=$\{cas.authn.jdbc.query\[0\].dialect\}
#cas.authn.attributeRepository.jdbc\[0\].singleRow=true
#cas.authn.attributeRepository.jdbc\[0\].order=0
#cas.authn.attributeRepository.jdbc\[0\].url=$\{cas.authn.jdbc.query\[0\].url\}
#cas.authn.attributeRepository.jdbc\[0\].username=auth_account
#cas.authn.attributeRepository.jdbc\[0\].user=$\{cas.authn.jdbc.query\[0\].user\}
#cas.authn.attributeRepository.jdbc\[0\].password=$\{cas.authn.jdbc.query\[0\].password\}
#cas.authn.attributeRepository.jdbc\[0\].sql=$\{cas.authn.jdbc.query\[0\].sql\}
#cas.authn.attributeRepository.jdbc\[0\].dialect=$\{cas.authn.jdbc.query\[0\].dialect\}
#cas.authn.attributeRepository.jdbc\[0\].ddlAuto=none
#cas.authn.attributeRepository.jdbc\[0\].driverClass=$\{cas.authn.jdbc.query\[0\].driverClass\}
#取消以下两行则在返回属性中仅包含表中的这两个字段属性,注释情况下返回该表行所有属性
#cas.authn.attributeRepository.jdbc\[0\].attributes.id=sfzjh
#cas.authn.attributeRepository.jdbc\[0\].attributes.name=email
#连接池配置
cas.serviceRegistry.jpa.pool.suspension=false
cas.serviceRegistry.jpa.pool.minSize=6
cas.serviceRegistry.jpa.pool.maxSize=18
cas.serviceRegistry.jpa.pool.maxWait=2000
cas.serviceRegistry.jpa.pool.timeoutMillis=1000
#设置的服务
#create-drop 重启cas服务的时候,就会给干掉
#create 没有表就创建,有就不创建
#none 一直都有
#update 更新
cas.serviceRegistry.jpa.ddlAuto=none
#cas日志配置
log.url=http://10.10.10.103:8000/log-service/log/saveLoginLog
log.corn=0 0/2 * * * ?
#cas用户权限验证接口
user.auth=http://10.10.10.16:8001/anon/getUser/
#redis 配置
cas.ticket.registry.redis.host=10.10.10.102
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6379
cas.ticket.registry.redis.password=simayi@123
cas.ticket.registry.redis.timeout=2000
cas.ticket.registry.redis.useSsl=false
cas.ticket.registry.redis.pool.max-active=20
cas.ticket.registry.redis.pool.maxIdle=8
cas.ticket.registry.redis.pool.minIdle=0
cas.ticket.registry.redis.pool.maxActive=8
cas.ticket.registry.redis.pool.maxWait=-1
cas.ticket.registry.redis.pool.numTestsPerEvictionRun=0
cas.ticket.registry.redis.pool.softMinEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.minEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.lifo=true
cas.ticket.registry.redis.pool.fairness=false
cas.ticket.registry.redis.pool.testOnCreate=false
cas.ticket.registry.redis.pool.testOnBorrow=false
cas.ticket.registry.redis.pool.testOnReturn=false
cas.ticket.registry.redis.pool.testWhileIdle=false
#账号注册手机和邮箱基本设置
#验证码有效时间(单位:分钟)
code.effect.time=10
#验证码发送间隔时间(单位:秒)
code.interval.time=60
#一天之内允许发送次数
code.send.time=5
#账号注册验证码模板
code.register.message.templdate=你的随机码是:%s,请勿告知他人,有效时间%s分钟
#找回密码验证码模板
code.find.password.message.templdate=你的随机码是:%s,请勿告知他人,有效时间%s分钟
#cas restful authn
#cas.authn.rest.uri=http://10.10.10.103:8014/cas/v1
#cas.authn.rest.passwordEncoder.type=$\{cas.authn.jdbc.query\[0\].passwordEncoder.type\}
#cas.authn.rest.passwordEncoder.characterEncoding=$\{cas.authn.jdbc.query\[0\].passwordEncoder.characterEncoding\}
#cas.authn.rest.passwordEncoder.encodingAlgorithm=$\{cas.authn.jdbc.query\[0\].passwordEncoder.encodingAlgorithm\}
# ticket过期设置
cas.ticket.st.numberOfUses=1
cas.ticket.st.timeToKillInSeconds=60自动构建证书
服务器需要支持https服务才需要配置证书,如果购买了证书,只需要配置证书路径、密码即可,测试环境可以根据java自带工具keytool来构建证书,如果服务不需要支持https,跳过这一部分。
keytool -genkey -alias casstore -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600
-genkey 生成秘钥
-alias 别名
-keyalg 秘钥算法
-keysize 秘钥长度
-validity 有效期
-keystore 生成秘钥库的存储路径和名称
-keypass 秘钥口令
-storepass 秘钥库口令
配置证书
使用解压工具打开文件cas.war(不是解压,文件修改完成后拖回压缩包), cas.war\WEB-INF\classes\application.properties
#证书地址
server.ssl.key-store=file:/etc/cas/thekeystore
#设定访问key store的密码
server.ssl.key-store-password=changeit
#访问key store中key的密码
server.ssl.key-password=changeit
Linux安装
- 1.普通安装:
java –jar cas.war- 2.docker镜像安装:
将cas.war 和 Dockerfile拷贝到同一目录下,Dockerfile内容如下:
FROM adoptopenjdk/openjdk11:alpine-slim
MAINTAINER lipengfei
ADD cas.war cas.war
EXPOSE 8014
ENTRYPOINT \["java","-server", "-noverify", "-Xmx2048M", "-jar","cas.war"\]- 3.制作镜像:
docker build -t cas-server /cas- 4.docker启动:
docker run -d --restart=always --name cas-https -p 8088:8088 cas-serverwindows 安装
java – jar cas.war结束
以上内容即为统一身份认证安装所有过程,安装过程中可能会涉及到数据库、redis、JDK11、TOMCAT等环境安装配置,本文档不提供安装步骤,请自行查找相关资料。
