SpringBoot 基於 CAS 實現單點登錄登出


1、下載 CAS 5.3 源碼:

git clone https://github.com/apereo/cas-overlay-template.git

由於以上命令會拷貝 CAS 的最新版本,如需切換到歷史版本,可執行如下操作:

1)cd 到該項目下;

2)git log 查看提交記錄,找到想要的提交記錄,粘貼對應的哈希值;

3)執行 git checkout 哈希值;

這時本地的代碼就會變成你想要的那個版本的代碼。

2、將下載的源碼導入 Idea:

(1)目錄結構如下(CAS5.3 采用 maven 項目結構):

(2)打開 POM.XML 文件,更換 repositories :

    <!-- 注釋以下部分,因為使用的是國外的倉庫,下載速度較慢 -->
    <!--<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>-->

    <!-- 添加阿里的倉庫 -->
    <repositories>
        <repository>
            <id>central</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <!-- 是否開啟發布版構件下載 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 是否開啟快照版構件下載 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

3、對源碼進行打包:

打包完成后會生成一個 target 目錄:

4、將打包后的 cas 文件夾復制到 tomcat 的 webapps 目錄下:

5、修改CAS服務端配置文件:
(1)在 cas\WEB-INF\classes 目錄的 application.properties 添加如下的內容:

# 自定義cas 登錄用戶名和密碼為 admin

#cas.authn.accept.users=casuser::Mellon
cas.authn.accept.users=admin::admin

# 兼容 Http 協議
cas.tgc.secure=false
# 開啟識別Json文件,默認false
cas.serviceRegistry.initFromJson=true

# 允許退出登錄后重定向到其他頁面
cas.logout.followServiceRedirects=true

(2)在 cas\WEB-INF\classes\services 目錄下的 HTTPSandIMAPS-10000001.json:

修改內容如下,即添加http
"serviceId" : "^(https|http|imaps)://.*",

6、啟動 tomcat 查看是否可以啟動 CAS Server:

 

如上,已成功訪問 CAS Server 登錄頁。

7、 CAS 客戶端配置:

(1)項目結構:

 項目結構為 maven 多模塊工程,其中sp-common模塊為公用模塊;sp-member 為會員模塊;sp-order 為訂單模塊。

(2)POM.XML 依賴:

<dependency>
  <groupId>net.unicon.cas</groupId>
  <artifactId>cas-client-autoconfig-support</artifactId>
  <version>2.1.0-GA</version>
</dependency>

(3)application.yml 配置:

1)客戶端 sp-member 模塊配置如下:

server:
  port: 8081

# 配置 cas server 信息
cas:
  # cas服務端的地址
  server-url-prefix: http://localhost:8080/cas
  # cas服務端的登錄地址
  server-login-url: http://localhost:8080/cas/login
  # 當前服務器的地址(客戶端)
  client-host-url: http://localhost:8081
  # Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter
  validation-type: cas3

2)客戶端 sp-order 模塊配置如下:

server:
  port: 8082

# 配置 cas server 信息
cas:
  # cas服務端的地址
  server-url-prefix: http://localhost:8080/cas
  # cas服務端的登錄地址
  server-login-url: http://localhost:8080/cas/login
  # 當前服務器的地址(客戶端)
  client-host-url: http://localhost:8082
  # Ticket校驗器使用Cas30ProxyReceivingTicketValidationFilter
  validation-type: cas3

8、進行客戶端測試:

(1)客戶端 sp-member模塊配置如下:

MemberController 類:

package member.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class MemberController {

    @RequestMapping("/test")
    @ResponseBody
    public String test(HttpServletRequest request) {
        return "member";
    }

    /**
     * 退出
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.invalidate();
        return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/logoutSuccess";

    }

    /**
     * 退出成功頁
     * @return
     */
    @RequestMapping("/logoutSuccess")
    @ResponseBody
    public String logoutSuccess() {
        return "member logoutSuccess";
    }

}

StartMember8081類(啟動類):

package member;

/**
 * 會員服務啟動類
 */
import net.unicon.cas.client.configuration.EnableCasClient;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

import java.util.HashMap;
import java.util.Map;

@EnableCasClient        // 開啟 Cas Client 注解
@SpringBootApplication
public class StartMember8081 {

    private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
    private static final String SERVER_NAME = "http://localhost:8081/";

    @Bean
    public FilterRegistrationBean filterAuthenticationRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        // AuthenticationFilter  該過濾器負責用戶的認證工作
        registration.setFilter(new AuthenticationFilter());
        // 設定匹配的路徑
        registration.addUrlPatterns("/*");
        Map<String,String> initParameters = new HashMap<String, String>();
        initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
        initParameters.put("serverName", SERVER_NAME);
        // 忽略 /logoutSuccess 的路徑
        initParameters.put("ignorePattern", "/logoutSuccess/*");
        registration.setInitParameters(initParameters);
        // 設定加載的順序
        registration.setOrder(1);
        return registration;
    }

    public static void main(String[] args) {
        SpringApplication.run(StartMember8081.class, args);
    }


}

(2)客戶端 sp-order 模塊配置如下:

OrderController類:

package order.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class OrderController {

    @RequestMapping("/test")
    @ResponseBody
    public String test() {
        return "order";
    }

    /**
     * 退出
     * @param request
     * @return
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.invalidate();
        return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8082/logoutSuccess";

    }

    /**
     * 退出成功頁
     * @return
     */
    @RequestMapping("/logoutSuccess")
    @ResponseBody
    public String logoutSuccess() {
        return "order logoutSuccess";
    }


}

StartOrder8082類(啟動類):

package order;

import net.unicon.cas.client.configuration.EnableCasClient;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

import java.util.HashMap;
import java.util.Map;


/**
 * 訂單服務啟動類
 */
@EnableCasClient        // 開啟 Cas Client 注解
@SpringBootApplication
public class StartOrder8082 {

    private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
    private static final String SERVER_NAME = "http://localhost:8082/";

    @Bean
    public FilterRegistrationBean filterAuthenticationRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new AuthenticationFilter());
        // 設定匹配的路徑
        registration.addUrlPatterns("/*");
        Map<String,String> initParameters = new HashMap<String, String>();
        initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
        initParameters.put("serverName", SERVER_NAME);
        // 忽略 /logoutSuccess 的路徑
        initParameters.put("ignorePattern", "/logoutSuccess/*");
        registration.setInitParameters(initParameters);
        // 設定加載的順序
        registration.setOrder(1);
        System.out.println("init filter");

        return registration;
    }


    public static void main(String[] args) {
        SpringApplication.run(StartOrder8082.class, args);
    }
}

(3)測試訪問(會員業務) http://localhost:8081/test 是否會被攔截:

如上,會員服務接口已被成功攔截,地址重定向了 CAS Server 的登錄頁面。

(4)測試訪問(訂單服務) http://localhost:8082/test 是否會被攔截:

如上,訂單服務接口也成功被攔截。

(5)測試當一個客戶端登錄后,另外一個客戶端是否可以訪問:

 

 如上,登錄后成功返回會員服務內容。

 

如上,刷新剛剛訂單服務請求地址,也成功返回訂單服務內容。

(6)測試當一個客戶端退出后,另外一個客戶端是否還可以訪問:

 

如上,先在瀏覽器訪問 http://localhost:8081/logout 接口,url 重定到 http://localhost:8081/logoutSuccess 接口,即表示會員服務已退出。

這時再刷新之前兩個服務的接口地址,均重定向到了 CAS Server 登錄頁,即實現了單點登出效果。

 

 

參考鏈接:https://www.jianshu.com/p/f2facc4d1c3a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM