JEECG 集成KiSSO單點登陸實現統一身份認證

JEECG 集成KiSSO單點登陸實現統一身份認證

JEECG 如何爲其餘第三方系統實現統一身份認證服務,實現單點登陸?

第三方系統如何對接呢?

今天爲你們揭開這層面紗,讓你們瞭解實質,使用它更快速的構建你們須要的業務

1、KISSO單點登陸介紹
          kisso 採用的是加密會話 cookie 機制實現單點登陸 SSO 服務,具有「無狀態」、「分散驗 證」 等特性。
         一、session 存放在服務器端,cookie 存放在客戶端,存在 2 種狀態:「 第一種:持久 cookie 具備時效性,以文件的形式存放在客戶機硬盤中, 時間一到生命週期結束自動被刪除。第二種:臨時 cookie 又叫會話 cookie 放在瀏覽器 內存中,瀏覽器關閉生命週期結束自動失效 」。
          二、單純不作任何改變而言 session 更安全,若是 cookie 採起各類安全保護措施,此時的 cookie 同樣安全。
          三、cookie 輕鬆實現分佈式服務部署,單點登陸跨域訪問等問題,換成 session 須要處理 session 複製及各類問題實現困難。

2、JEECG集成KiSSO實現統一身份認證服務

          JEECG系統做爲服務端,實現統一身份認證服務,爲其餘第三方系統提供統一登陸入口,共享用戶資源,實現同一個用戶名和密碼登陸多個系統。
          那JEECG如何實現的服務呢?下面切入正題。java

  
一、服務端集成KISSO
              (1) JEECG 工程 Maven依賴相關的jarweb

<!-- kisso begin -->
<dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>kisso</artifactId>
      <version>3.6.11</version>
</dependency>
<dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.15</version>
</dependency>
<!-- kisso end -->

       (2)服務端項目配置文件。kisso啓動配置有兩種配置方式:spring方式初始化、Servlet方式初始化。根據不一樣的工程結構選擇合適的配置方式,JEECG使用的是springMVC框架,我這裏選擇使用spring方式初始化方式。
           下面兩種初始化方式以下:
            第一種:spring方式初始化方式spring

<bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
            <property name="ssoPropPath" value="sso.properties" />
            <!-- 不一樣環境配置選擇設置 ,dev_mode/開發模式 ,test_mode/測試模式 ,online_mode/生產模式-->
            <property name="runMode" value="test_mode" />
</bean>

       第二種:Servlet方式初始化json

<context-param>
         <param-name>kissoConfigLocation</param-name>
         <!-- SSO 屬性文件地址根據實際項目配置 -->
         <param-value>classpath:sso.properties</param-value>
</context-param>
<listener>
         <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
</listener>

  

    這兩種方式,都會加載一個屬性配置文件sso.properties該文件放到classpath下

    sso.properties 配置文件內容:跨域

  1. <blockquote>#單點登陸信息加密密鑰
複製代碼

        至此,服務端集成完成,sso.properties 須要注意的是:sso.secretkey單點登陸信息加密密鑰,此祕鑰在登陸完成後會把用戶的信息經過此祕鑰進行加密,保存到cookie中,爲了安全不要泄露此密鑰;sso.cookie.domain是單點登陸域名配置,配置一級域名。JEECG服務端系統和第三方對接的客戶端系統須要在同一個域名下,跨域的問題暫不考慮。

        本地調試時服務的訪問必定要使用域名,系統host配置域名test.com便可。

二、JEECG統一身份認證服務代碼實現原理

       JEECG系統集成配置完成,那麼怎麼實現的統一登陸服務呢?
       JEECG系統原有的登陸時不能給第三方系統提供統一登陸服務,爲了避免印象原有的系統業務,咱們須要另外實現一個登陸入口代碼以下:http://sso.test.com:8080/jeecg/toLogin.do瀏覽器

/**
* 單點登陸
* @author zhoujf
* 
*/
@Controller
@RequestMapping("/")
public class SSOController extends BaseController{
        private Logger log = Logger.getLogger(SSOController.class);
        
        
        @RequestMapping(value = "toLogin")
        public String toLogin(HttpServletRequest request) {
                String returnURL = request.getParameter("ReturnURL");
                log.info("SSO 資源路徑returnURL:"+returnURL);
                request.setAttribute("ReturnURL", returnURL);
                return "login/login";
        }
        
        
}

    第三方客戶端集成KISSO後若是嚴重沒有登陸,則會跳轉到這個地址進行登陸,在跳轉這個地址時會帶一個參數ReturnURL,該參數是第三方系統當時訪問的請求地址,JEECG服務端登陸後會再回跳到這個地址。以上代碼段在進入登陸頁面後把回跳地址帶入登陸頁面,以便登陸後回跳該地址
    那麼服務端,登陸回跳怎麼實現的呢?下面在登陸邏輯中增長以下代碼便可實現:安全

//-----------------------單點登陸-------------------------------------------------
                        /*
                         * 單點登陸 - 登陸須要跳轉登陸前頁面,本身處理 ReturnURL 使用 
                         * HttpUtil.decodeURL(xx) 解碼後重定向
                         */
                        String returnURL = (String)request.getSession().getAttribute("ReturnURL");
                        log.info("login 資源路徑returnURL:"+returnURL);
                        if(StringUtils.isNotEmpty(returnURL)){
                                SSOToken st = new SSOToken(request);
                                st.setId(UUID.randomUUID().getMostSignificantBits());
                                st.setUid(user.getUserName());
                                st.setType(1);
                                //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, maxAge);
                                // 能夠動態設置 Cookie maxAge 超時時間 ,優先於配置文件的設置,無該參數 - 默認讀取配置文件數據 。
                                //  maxAge 定義:-1 瀏覽器關閉時自動刪除 0 當即刪除 120 表示Cookie有效期2分鐘(以秒爲單位)
                                //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, 60);
                                SSOHelper.setSSOCookie(request, response, st, true);
                                returnURL = HttpUtil.decodeURL(returnURL);
                                log.info("login 資源路徑returnURL:"+returnURL);
                                request.getSession().removeAttribute("ReturnURL");
                                try {
                                        response.sendRedirect(returnURL);
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                                return null;
                        }
                        //------------------------單點登陸----------------------------------------------

    以上服務端統一登陸服務就完成了!!!!

3、第三方系統對接JEECG統一認證服務

     一、第三方系統KISSO集成

       (1) 客戶端 工程 Maven依賴相關的jar服務器

<!-- kisso begin -->
<dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>kisso</artifactId>
      <version>3.6.11</version>
</dependency>
<dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.15</version>
</dependency>
<!-- kisso end -->

(2)第三方項目配置文件。kisso初始化以及登陸驗證攔截器配置有兩種配置方式:spring方式初始化、Servlet方式初始化。根據不一樣的工程結構選擇合適的配置方式,我這裏第三方系統使用的也是springMVC框架,選擇使用spring方式初始化方式。

           下面兩種初始化方式以下:

            第一種:spring方式初始化方式cookie

<bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
            <property name="ssoPropPath" value="sso.properties" />
            <!-- 不一樣環境配置選擇設置 ,dev_mode/開發模式 ,test_mode/測試模式 ,online_mode/生產模式-->
            <property name="runMode" value="test_mode" />
</bean>

<mvc:interceptors>
<!-- SSO 登陸驗證攔截器 path 對全部的請求攔截使用/**,對某個模塊下的請求攔截使用:/myPath/* -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.baomidou.kisso.web.interceptor.SSOSpringInterceptor" />
</mvc:interceptor>
<!-- SSO 系統權限攔截器 TODO 須要本身實現攔截器來控制權限處理(菜單權限,功能權限控制) -->

</mvc:interceptors>
 

   第二種:Servlet方式初始化session

<context-param>
         <param-name>kissoConfigLocation</param-name>
         <!-- SSO 屬性文件地址根據實際項目配置 -->
         <param-value>classpath:sso.properties</param-value>
</context-param>
<listener>
         <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
</listener>

<!-- SSOFilter use . -->
<filter>
       <filter-name>SSOFilter</filter-name>
       <filter-class>com.baomidou.kisso.web.filter.SSOFilter</filter-class>
       <init-param>
       <param-name>over.url</param-name>
       <!-- 不攔截的請求配置在這裏 -->
       <param-value>/index.jsp</param-value>
       </init-param>
</filter>
<filter-mapping>
       <filter-name>SSOFilter</filter-name>
       <url-pattern>/*</url-pattern>
</filter-mapping>

    這兩種方式,都會加載一個屬性配置文件sso.properties該文件放到classpath下

    sso.properties 配置文件內容:

#單點登陸信息加密密鑰
sso.secretkey=Kisso4springMvc80mAS
#cookie名稱
sso.cookie.name=uid
#cookie單點服務器登陸域名(本地測試須要host配置域名test.com,不能使用ip)
sso.cookie.domain=.test.com
#服務端登陸地址
sso.login.url=http://sso.test.com:8080/jeecg/toLogin.do

    sso.properties 須要注意的是:sso.secretkey單點登陸信息加密密鑰,和服務端配置保持一致;
    sso.cookie.domain是單點登陸域名配置,配置一級域名。和服務端配置保持一致;跨域的問題暫不考慮。
    sso.login.url   是服務端實現的統一登陸服務入口地址
    本地調試時服務的訪問必定要使用域名,系統host配置域名test.com便可。

    以上 第三方系統對接統一認證服務完成!!

二、測試驗證方法

(1)啓動JEECG服務端項目

(2)啓動第三方系統

(3)找一個第三方系統的請求測試

    例如:http://sso.test.com/jeecg-p3-web/system/back.do?index

    請求後,未登陸的狀況下,跳轉到JEECG統一認證系統進行登陸,地址以下:
http://sso.test.com:8080/jeecg/toLogin.do?ReturnURL=http%253A%252F%252Fsso.test.com%252Fjeecg-p3-web%252Fsystem%252Fback.do%253Findex

11.png 

    登陸以後,回跳到地址 http://sso.test.com/jeecg-p3-web/system/back.do?index

22.png 

相關文章
相關標籤/搜索