2

2020/02/06 更正TIPS:

  • DEMO工程 https://github.com/kasaya/casDemo.git
  • cas.war包其实不需要自己去编译。cas-server-webapp-tomcat 在maven中央仓库里有,可以不用编译,直接引用就可以了。
  • cas-server-webapp-tomcat 中含有 spring-boot-starter-web,所有不需要再次引用
  • 按照官网的意思,web-inf/classes下的都是resources
    d4ab9be9e29e9ff7e8fbf5eae4e28ca.png所以使用idea编译的时候,需要指定resource的路径(在你的项目配置中指定)
  • idea 需要把 Overlay下的WEB-INF/lib作为额外的lib添加到项目里
  • 需要用java 11编译
  • 极简的Pom引用如下:
<parent>  
     <groupId>org.springframework.boot</groupId>  
     <artifactId>spring-boot-starter-parent</artifactId>  
     <version>2.1.8.RELEASE</version>  
     <relativePath/> <!-- lookup parent from repository --> 
</parent>  
<groupId>com.example</groupId>  
<artifactId>demo</artifactId>  
<version>0.0.1-SNAPSHOT</version>  
<name>demo</name>  
<packaging>war</packaging>  
<description>Demo project for Spring Boot</description>  
  
<properties>  
   <java.version>11</java.version>  
</properties>  
  
<dependencies>  
 <dependency> 
     <groupId>org.springframework.boot</groupId>  
     <artifactId>spring-boot-starter</artifactId>  
     <exclusions> 
         <exclusion> 
             <groupId>org.springframework.boot</groupId>  
             <artifactId>spring-boot-starter-logging</artifactId>  
         </exclusion> 
     </exclusions>
 </dependency>  
  
 <dependency> 
     <groupId>org.apereo.cas</groupId>  
     <artifactId>cas-server-webapp-tomcat</artifactId>  
     <version>6.0.5</version>  
     <type>war</type>  
 </dependency>  
  
</dependencies>  
  
<build>  
     <plugins> 
         <plugin> 
             <groupId>org.springframework.boot</groupId>  
             <artifactId>spring-boot-maven-plugin</artifactId>  
         </plugin> 
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>  
             <artifactId>maven-war-plugin</artifactId>  
             <configuration>
             <archiveClasses>false</archiveClasses>  
             <failOnMissingWebXml>false</failOnMissingWebXml>  
             <overlays>
                 <overlay> 
                     <groupId>org.apereo.cas</groupId>  
                     <artifactId>cas-server-webapp-tomcat</artifactId>  
                 </overlay>
             </overlays> 
         </configuration> 
         </plugin> 
     </plugins>
 </build>

更新于:2020/02/06


最近又开始调查单点登录了。(为什么说“又”)
说到单点登录应该第一想到的就是CAS 这套框架。
首先看官网给的CAS流程(非代理):其他流程可以参考官网

clipboard.png

然后明白了流程之后,我按照官网指示的通过overlay的方式搭建自己的CAS server。(官网上说,编译的cas.war其实是可以直接运行的,但是你肯定是要自定义一些内容,所以可以通过overlay来方便你构建)

首先是下载官网提供的模板 apereo/cas-overlay-template 注意官网说建议使用master分支,但是我看了下,master分支是不稳定的版本,所以后来选择了6.0的这个分支。

clipboard.png

下载好之后呢,开始bulid 目标的cas.war包, 进入目录下可以看的bulid.cmd 和 build.sh 脚本,
clipboard.png

执行 ./build.sh help 可以看到所有可以执行的命令;
执行 ./bulid.sh package 打包,生成文件在bulid/libs 目录下
etc 目录下有 thekeystore,log4j.xml 等配置文件,后面都可以放到/resources目录下

事前工作准备好了,接下来开始构建server吧

1. 创建一个简单的spring boot项目。

就和你平时创建spring boot 项目一样创建一个boot项目:)

<!--首先是依赖父项目, 注意 packaging 是 "war"--> 
   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> 
    </parent>
    <groupId>org.xxx.cas</groupId>
    <artifactId>cas-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>cas-server</name>
    <description>cas server for Spring Boot</description> 

 .... 
       <!-- 剔除logback, cas 的中用的是 log4j-->
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2. 更改pom配置

  • 注意点1: maven overlay 的使用
      <!--首先是需要引入, 注意 type 是 "war"-->
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-webapp-tomcat</artifactId>
            <version>6.0.5</version>
            <type>war</type>
        </dependency>


        ....

          <!--其次在build中加入 插件,overlay 元素中加入需要 使用overlay 的模块名称-->
       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <archiveClasses>false</archiveClasses>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <overlays>
                    <overlay>
                        <groupId>org.apereo.cas</groupId>
                        <artifactId>cas-server-webapp-tomcat</artifactId>
                    </overlay>
                </overlays>
            </configuration>
        </plugin>

这个引入的cas-server-webapp-tomcat 包,其实就是刚刚先前打出的car.war包。我试过通过local引用,但是无法生成overlay目录,
说以我只好吧car.war放在本地的mavne仓库里,然后改名为cas-server-webapp-tomcat-6.0.5.war

注意:这个包名是通过cas-overlay-template-6.0 目录下的gradle.properties 与 build.gradle 中的设值 推断出来的。

配置正确后会生成一个overlays目录

clipboard.png

将overlaysorg.apereo.cas.cas-server-webapp-tomcat-6.0.5WEB-INFclasses下的 配置文件 copy 到resources下,主要是application.properties文件
(这是6.0.5的版本的做法,6.1.x的配置文件在一个lib目录下的 某个 resources.jar包里)

  • 注意点2: 引入对应的依赖包
       <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-webapp-init</artifactId>
            <version>6.0.5</version>
        </dependency>

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-webapp</artifactId>
            <type>pom</type>
            <version>6.0.5</version>
        </dependency>


        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc</artifactId>
            <version>6.0.5</version>
        </dependency>

这里是没弄明白的地方
cas-server-support-jdbc 不用说是支持jdbc
cas-server-webapp-init 含有启动类 org.apereo.cas.web.CasWebApplication
cas-server-webapp 貌似含有一些依赖项目
这两者都不能缺,但是从名字上来看 cas-server-webapp 应该是包含了 cas-server-webapp-init,然而我引入的时候 cas-server-webapp-init 无法自动引入

  • 注意点3: 修改application.properties 文件
# thekeystore 的存放地址 thekeystore可以按照普通的ssl生成方式生成
server.ssl.key-store=classpath:thekeystore
server.ssl.key-store-password=changeit
server.ssl.key-password=changeit

# 默认用户名密码
#cas.authn.accept.users=casuser::Mellon   
#cas.authn.accept.name=Static Credentials

# 链接数据库 这里用的是mysql
cas.jdbc.showSql=true
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].url=jdbc:mysql://XXXXX/managementAuth?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
cas.authn.jdbc.query[0].user=XXXX
cas.authn.jdbc.query[0].password=XXXXX
cas.authn.jdbc.query[0].sql=select password from tbl_user where username= ?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver

以上是使用内置tomcat的做法,如果要用外置tomcat 唯一的区别是引用包的不同,

去除cas-server-webapp-init 的引用,因为不需要内部启动类 其他保持一致。

       <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-webapp-init</artifactId>
            <version>6.0.5</version>
        </dependency>

clipboard.png

能看到这个画面就算启动成功了。clipboard.png

总结:

调查了两周才把这一个服务端跑起来,我可能是个渣渣。为什么做了两个周,我想我在实现和版本选择上做了很多测试。

首先是war包,cas是基于spring boot构建的,6.0 以上需要spring boot 2.0以上的支持,网上的大部分教程是5.4的版本,我的项目工程是spring boot 2.0 的,所以做起来有些不一样。6.0 以上的 官方给的war包构建是用gradle ,gradle不熟悉,搞了半天才构建成功。为什么不用最新的6.1.X的版本? 因为需要 spring boot 2.2.0.m6这个版本,可惜现在还不能用貌似(是pre的)所以最后使用了相对稳定的6.0.5。

然后,网上大部分是用外置tomcat启动工程的,然后我看官网上说因为是基于spring boot的大可以用内置tomcat启动,不建议用外置web容器,那找到启动类又花了很长时间。

总的来说我可能是个废材。clipboard.png


kasaya
16 声望9 粉丝

SLAYERS スレイヤーズ