ruoyi-cloud框架集成cas及权限管理
背景:
单位要求借着新开发系统的机会,整合单点登录,新系统是基于ruoyi-cloud的,需在ruoyi-cloud中集成cas,于是冲浪了一段时间,发现有一些gitee和github有一些现成的,如gitee上唐雁的项目 唐雁 / ruoyi-cloud-cas,果断拉下来,但拉下来之后发现有一定问题,由于他的项目是采用ruoyi-cloud-2.5.0的项目,调通之后发现有一定问题(如:无法完成跳转,登录之后admin没有权限),主要原因有nacos版本不匹配,gateway无法从nacos拿到白名单,可能他改过权限,也有可能是2.4.0的原因(没有使用过以前的版本),admin登录无权限,于时参考唐雁老师的项目,以及博客ruoyi-cloud开源框架集成cas,集成了cas,但是博客中也有一些问题,以及描述不够详细,下文的很多方法,来自于该博客及项目。
仓库地址: https://gitee.com/yong-liu/ruoyi-cloud-cas
我的环境
nacos 2.0.4
tomcat 9.0.38
jdk 1.8.0_161
vue 3
ruoyi-cloud 3.4.0
整体逻辑及认证步骤,上文提到的博客秒速的非常详细,这里整体引用一下
整体逻辑
CAS为对通过认证的用户分配ticket,通过发放ticket对用户进行管理,而ruoyi-cloud的认证及权限的管理则是依靠ticket完成的。所有解决问的核心逻辑:
1、cas对访问ruoyi-cloud但不持有ticket的用户进行拦截,用户需在cas进行认证。
2、用户在cas完成认证后,在ruoyi-cloud后端自动为用户生产token,全过程对用户无感知。
3、完成1、2两步之后,用户即持有老系统的ticket,又持有ruoyi-cloud的token。
具体cas集成认证步骤
如下图所示
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
1、cas配置
第一步:生成秘钥库
我们采用JDK自带的keytool工具生成秘钥库
别名 java1234 存储路径 D:\cas\keystore
keytool -genkey -v -alias java1234 -keyalg RSA -keystore D:\cas\keystore\java1234.keystore
这里需要填写一些信息,注意填写要域名;
秘钥库密码我们用 666666
执行完,会生成一个秘钥库文件;
第二步:从秘钥库里导出证书
keytool -export -trustcacerts -alias java1234 -file D:/cas/keystore/java1234.cer -keystore D:/cas/keystore/java1234.keystore
输入第一步的秘钥库密码 666
即可生成证书;
证书文件;
第三步:将证书导入到JDK证书库
keytool -import -trustcacerts -alias java1234 -file D:/cas/keystore/java1234.cer -keystore "E:/jdk1.8/jre/lib/security/cacerts"
密码: changeit
第四步:tomcat配置https支持
这里我们采用tomcat9
找到tomcat->conf->server.xml 打开文件
加下如下配置即可;
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\cas\keystore\java1234.keystore"
keystorePass="666666" />
启动bin下的startup.bat
(默认有中文乱码,可以我们来到tomcat目录的conf子目录中,找到一个名为 "logging.properties" 的文件,打开这个文本文件,找到如下配置项:
java.util.logging.ConsoleHandler.encoding = UTF-8
将 UTF-8 修改为 GBK,修改后的效果为:
java.util.logging.ConsoleHandler.encoding = GBK
保存后,重启tomcat!)
第五步:测试
访问 https://localhost:8443
把war包放tomcat下,启动tomcat会自动解压,我们把名称改成cas,方便访问;
注意点:日志修改
访问:https://localhost:8443/cas
cas 8443端口
配置hosts: C:\Windows\System32\drivers\etc
127.0.0.1 java1234.com
通过域名访问:
https://java1234.com:8443/cas
用户名:casuser
密码:Mellon
修改cas账号密码为admin,admin123否则后文整合ruoyi-cloud的时候,auth模块无法从,数据库拿到权限信息及角色信息。
修改写死的认证用户,cas的application.properties中
cas.authn.accept.users=admin::admin123
此外发现在application.properties中配置了如下配置,忘了干嘛的了,如果不行可以加上去试试
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
cas.serviceRegistry.json.location=classpath:/services
此文不论证连接数据库做sso,连接数据库查询,只需要在本文的基础上,cas配置数据库,并修改若依修改密码,添加用户的密码加密方式即可(MD5),若依不做密码验证。
此外为了支持客户端http访问到cas,修改cas目录下的\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json文件,在serviceId中加入http
就此cas配置完成(未配置数据库及密码加密方式)
2、后端修改
拉取RUOYI-Cloud-3.4.0,运行nacos,项目正常启动后,继续下面的步骤
注意,项目的jdk必须选中为上面cas配置的jdk,否则会报错(控制台auth模块报错证书验证不通过),可以在项目结构中修改
nacos中ruoyi-gateway-dev.yml,配置白名单
ignore:
whites:
- /auth/logout
- /auth/login
- /auth/register
- /*/v2/api-docs
- /csrf
- /auth/casLogin
- /auth/TokenLogout
核心代码
auth模块添加pom依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
添加相应文件
<