先说下项目背景,公司的项目原来用的kisso+shiro,但是kisso太小众了,性能各方面也不满足要求,所以老大要更换springboot+cas+shiro+pac4j集成,楼主在资料极少的情况下弄了很久还是没配置好shiro+pac4j,项目老大奋斗到深夜给解决了,所以写一篇博客造福小白了!

首先下载cas,下载5以上的版本 https://github.com/apereo/cas-overlay-template

编译

解压zip,命令行进去,执行mvn clean package 
结束之后会出现 target 文件夹,里面有war包啥的,把war包解压,比如我们把解压后的文件夹命名为 cas_war 吧,后文提到 cas_war 就代表是这个文件夹

本地配置tomcat通过https访问

注意以下所有命令除了文件路径最好都跟我的保持一致,比如alias,就用tomcat不要换别的,省的小白出问题 
命令行里cd进入%JAVA_HOME%/bin目录,配置了环境变量就不用了

1.执行:

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "E:\projects\hugeo\cas\tomcat.keystore" 
按照以下输入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
密钥库口令:123456(这个密码非常重要)

名字与姓氏:www.hugeo.com(域名很重要,建议自己编个域名,在host文件里写好映射host的使用百度吧

组织单位名称:anything(随便填)

组织名称:anything(随便填)

城市:anything(随便填)

省市自治区:anything(随便填)

国家地区代码:anything(随便填)

现在E:\projects\hugeo\cas\tomcat.keystore这个文件生成了

2.继续执行:

keytool -export -file E:\projects\hugeo\cas\cas.crt -keystore E:\projects\hugeo\cas\tomcat.keystore -alias tomcat 
用刚刚的tomcat.keystore文件生成了cas.crt文件

3.导入授权文件到jdk并设置密码:

keytool -import -file E:\projects\hugeo\cas\cas.crt -alias tomcat -keystore E:\programFiles\Java\jre1.8.0_131\lib\security\cacerts -storepass 123456 
注意-storepass 123456是设置此步骤的密码的,第一次执行命令设置之后以后再执行这个命令就不要带这个参数了,然后输入密码的时候输第一次设置的密码,这个密码和生成keystore的密码可以不一样,设置成一样的比较方便防止搞混

要删除也很容易: 
keytool -delete -alias tomcat -keystore E:\programFiles\Java\jre1.8.0_131\lib\security\cacerts

(如果导入的时候没有设置别名就再导入一次,会显示别名)

5.修改tomcat的配置文件server.xml

删掉:

1
2
3
4
5
<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" />

添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<Connector

protocol="org.apache.coyote.http11.Http11NioProtocol"

port="8443" maxThreads="200"

scheme="https" secure="true" SSLEnabled="true"

keystoreFile="E:\projects\learn\cas\tomcat.keystore" keystorePass="123456"

clientAuth="false" sslProtocol="TLS"/>

6.把crt文件导入浏览器,我用的是chrome

这里写图片描述
这里写图片描述
把第二步生成的crt文件导进去进行了

7. 检查配置

把 cas_war 放到tomcat的webapp下面改名为cas,启动tomcat,浏览器访问https://www.hugeo.com:8443/cas/login,如果提示签名不正确之类的就点击高级/详细信息,继续访问。

8.注意

大部分情况下本地开发是不需要ssl访问的,所以建议给cas单独弄个tomcat,反正一个tomcat也就十几兆,我本地开发其他项目时用tomcat8,cas使用的是tomcat9,版本其实也没太大关系,好像是高于tomcat8的版本就可以了

建项目

用idea新建一个spring boot项目,什么插件都不需要 
pom.xml是从第一步下载的zip里的pom文件改造的,最好大概看一下理解一下,需要修改的地方自己改:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.hugeo</groupId>

<artifactId>cas</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>war</packaging>

<name>cas</name>

<description>Demo project for Spring Boot</description>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<cas.version>5.2.3</cas.version>

<app.server>-tomcat</app.server>

<mainClassName>org.springframework.boot.loader.WarLauncher</mainClassName>

<isExecutable>false</isExecutable>

<manifestFileToUse>

${project.build.directory}/war/work/org.apereo.cas/cas-server-webapp${app.server}/META-INF/MANIFEST.MF

</manifestFileToUse>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<springboot.version>2.0.0.RELEASE</springboot.version>

</properties>

<repositories>

<repository>

<id>sonatype-releases</id>

<url>http://oss.sonatype.org/content/repositories/releases/</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

<releases>

<enabled>true</enabled>

</releases>

</repository>

<repository>

<id>sonatype-snapshots</id>

<url>https://oss.sonatype.org/content/repositories/snapshots/</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

<releases>

<enabled>false</enabled>

</releases>

</repository>

<repository>

<id>shibboleth-releases</id>

<url>https://build.shibboleth.net/nexus/content/repositories/releases</url>

</repository>

</repositories>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<version>${springboot.version}</version>

<configuration>

<mainClass>${mainClassName}</mainClass>

<addResources>true</addResources>

<executable>${isExecutable}</executable>

<layout>WAR</layout>

</configuration>

<executions>

<execution>

<goals>

<goal>repackage</goal>

</goals>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

<version>2.6</version>

<configuration>

<warName>cas</warName>

<failOnMissingWebXml>false</failOnMissingWebXml>

<recompressZippedFiles>false</recompressZippedFiles>

<archive>

<compress>false</compress>

<manifestFile>${manifestFileToUse}</manifestFile>

</archive>

<overlays>

<overlay>

<groupId>org.apereo.cas</groupId>

<artifactId>cas-server-webapp${app.server}</artifactId>

</overlay>

</overlays>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.3</version>

</plugin>

</plugins>

<finalName>cas</finalName>

</build>

<dependencies>

<!-- 和maven-war-plugin里配置的overlays配合使用 -->

<dependency>

<groupId>org.apereo.cas</groupId>

<artifactId>cas-server-webapp${app.server}</artifactId>

<version>${cas.version}</version>

<type>war</type>

<scope>runtime</scope>

</dependency>

<!-- 自己需要的jar包,我这里用到了查库验证身份,所以引入了mysql -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.44</version>

</dependency>

</dependencies>

</project>

搞了很久的还有一个原因是以前没有接触过maven的overlay用法,这个功能就是引入一个war包(不知道jar包可不可以,没试),然后打包的时候,框架会在这个war包的基础上把自己写的类啊,配置文件啊什么加进去,如果原来已经有了就覆盖,了解这个之后就觉得这个用法挺好的,保持了项目的简洁性,实现无侵入性改造。 
我理解的这两个地方是配合使用的: 
这里写图片描述

dependency的war包用于覆盖,overlay用于配置哪些文件不打包到最终war包里,类似这种用法: 
这里写图片描述  
不过我也没试过,猜测的

这样虽然可以打包了,但是依赖的war包里的类并不能编译,想写一个类继承war包里的一个类搞不定,引用不到,scope改成compile也是一样,有博客提到用下面这种糟糕的方式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<dependency>

<groupId>org.apereo.cas</groupId>

<artifactId>cas-server-webapp${app.server}</artifactId>

<version>${cas.version}</version>

<type>jar</type>

<classifier>classes</classifier>

<scope>provided</scope>

</dependency>

相当于是把war包里需要的jar都下载下来的意思,下载了半年都没下好,很浪费时间空间,因为需要的jar包在咱们的 css_war/WEB_INF/lib 下面都有了啊,所以就不搞这些虚的了,直接在 Project Structure->Modules->Dependencies把 css_war/WEB_INF/lib 引入进来,scope选provided。

==================================图解分割线=================================================

如果你用的idea这几个一起按(Ctrl+Shift+Alt+S)会出现这么一个图   如果是elps是那个小瓶子,自己解决

webapp目录需要自己创建,如果不用在里面加什么自定义文件的话不创建也可以 
目前为止项目结构: 
这里写图片描述

application.properties和META-INF文件夹从 css_war 里面拷贝出来,后面自己定制化会涉及到修改这两个文件

配置调试注意: 
1. tomcat选择配置了ssl的那个 
2. url自己写一下,跟下面的https端口一样 
3. jdk至少1.8 
4. http port不要填,否则启动会报错 
5. contextpath配置一下 
这里写图片描述
这里写图片描述
第一次启动应该会出现: 
这里写图片描述  
选accept就行了

大功告成了 
这里写图片描述

用户名casuser,密码Mellon。 

后面会集成 自定义数据库认证

shiro+pac4j的集成,权限管理

因为我主要讲解的是shiro+pac4j,前面的基础借鉴https://blog.csdn.net/u010588262/article/details/79741626 这个博客