欧美成人一区二免费视频,暖暖 在线 日本 免费 中文 ,男人j桶进女人p无遮挡的图片,欧美+日本+国产,久久亚洲中文字幕无码

單點登錄

一.功能價值簡述

用戶第三方系統(tǒng)與領星實現登錄集成,實現雙系統(tǒng)無縫登錄打通

 

二.操作說明

1、配置單點登錄功能

      在【業(yè)務配置】-【全局】-【單點登錄設置】中打開單點登錄配置對單點登錄方式進行配置。

單點登錄方式:目前僅支持JWT

驗簽算法:目前僅支持HS256

驗簽密鑰:雙方約定對稱加密秘鑰,不能低于32個字符,不能超過256個字符

企業(yè)唯一標識:進行單點登錄時候校驗企業(yè)唯一標識符,通過此編號可以識別你的企業(yè)ID

未映射用戶處理方式:

類型

處理規(guī)則

創(chuàng)建(默認)

當根據用戶唯一性映射字段,進行映射時候,如果檢測不到此用戶,則自動創(chuàng)建一個新用戶。

適用于全部用戶在鑒權系統(tǒng)管理,領星不管理用戶客戶使用

禁止登錄

當映射不到用戶時候,禁止此用戶登錄系統(tǒng)。

適用于領星有獨立的一套用戶管理體系,只有創(chuàng)建并配置好映射的用戶能夠實現單點登錄。

用戶唯一性映射字段:

首次單點登錄時候,進行驗證的唯一字段,首次映射之后,會綁定雙向的唯一ID,后續(xù)變更手機號或者真實姓名都不影響單點登錄功能使用。

  • 手機號映射:選定手機號映射時,手機號不允許為空。
  • 郵箱映射:選定郵箱映射時,郵箱不允許為空。
  • 用戶名映射:選定用戶名映射時,用戶名不允許為空。

2、JWT基本格式

JWT是由三段信息構成的,將這三段信息文本用"."鏈接一起就構成了JWT字符串。以下為示例

eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ1c2VySWQwMDEiLCJtb2JpbGUiOiIxMDAwIiwiZXhwIjoxNjgzNTE3OTg5LCJlbWFpbCI6Imxpbmd4aW5nVXNlckBpbmd4aW5nLmNvbSIsInVzZXJuYW1lIjoibGluZ3hpbmdVc2VyIiwicmVhbG5hbWUiOiLpoobmmJ_nlKjmiLcifQ.hnTxa5qkg6HD8xinBjF2VPnfH6WKuhzh8qORYq8ljMI

    

  1. 第一部分是header,明文是{"typ":"JWT","alg":"HS256"},經過base64URL編碼之后是eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  2. 第二部分是payload,明文是{"sub":"userId001,"exp":"1683517989095","mobile":"10000","email":"lingxingUser@ingxing.com", "username":""lingxingUser,"realname":"領星用戶"} 其中sub是必須字段,mobile/email/username則根據jwt配置信息中的唯一映射字段填寫),經過base64URL編碼之后是eyJzdWIiOiJ1c2VySWQwMDEiLCJtb2JpbGUiOiIxMDAwIiwiZXhwIjoxNjgzNTE3OTg5LCJlbWFpbCI6Imxpbmd4aW5nVXNlckBpbmd4aW5nLmNvbSIsInVzZXJuYW1lIjoibGluZ3hpbmdVc2VyIiwicmVhbG5hbWUiOiLpoobmmJ_nlKjmiLcifQ
  3. 第三部分是signature,由第一部分的header+"."+第二部分的payload得到需要簽名的信息是eyJ0eXAiOiJKV1QiLCJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJzdWIiOiJ1c2VySWQwMDEiLCJtb2JpbGUiOiIxMDAwIiwiZXhwIjoxNjgzNTE3OTg5LCJlbWFpbCI6Imxpbmd4aW5nVXNlckBpbmd4aW5nLmNvbSIsInVzZXJuYW1lIjoibGluZ3hpbmdVc2VyIiwicmVhbG5hbWUiOiLpoobmmJ_nlKjmiLcifQ,經過相應簽名算法簽名以后(在本例中就是HS256),再通過base64URL編碼得到簽名是hnTxa5qkg6HD8xinBjF2VPnfH6WKuhzh8qORYq8ljMI以上為jwt生成過程的基本說明,具體細節(jié)以及實現庫可以通過JWT官網進一步了解。

 

3、JAVA開發(fā)實例

3.1 基于自定義實現

1、pom引入JWT依賴包
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>3.16.0</version>
</dependency>
2、Java示例代碼
package com.asinking.cloud.uc.admin.util;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import javax.crypto.Cipher;
import java.net.URLEncoder;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 *  SSO-JWT第三方系統(tǒng)代碼示例
 * </p>
 */
public class SSOJwtUtil {

    private static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMl5dXIwbawEOpMY+x02TRMhRXl0Ng4fbF0xofgCRfPkeO9JKU/An4+MtSyXDQNEGh+Eb8e1M2zJ4M7zf3DZ2wBcXn3247xKK8xol8VW2ytuGm5yBvtQpuuwwMTuf4k5rmQj4cMW4Ob2hIumjI4TiwwpEV0CIN4HKsLPXmC2EMsdAgMBAAECgYA/51F0NZ4jqHe3vn2vx1BtF+mEW3LlydvCN4LrOjVb5YTiSO9ch3lUu8mfag3LkmdCxev6iSPVhrbSjXNHpSIMC/xKk/FMjKGXCCsMt8DTzIgOSS8V+7TSr/vxwOOEmQyYxrjdS748dXlAlQ8YslbUxIWO34qFLjpG+YkIb9JvNQJBAO9Ec9P9IQAuslcrhH4Lpph8PHaTdKp+R4xHbx2hbmTdgTg+cYKBTVGec3Caeocr8VgtfSZgPBJGEJi7RNcfXk8CQQDXkGh+dHYli7Sz/Cj4RQzXWAlmaw0Jgmc4eoucj5BGtM85ZtmSKZUXTM3iLidiD8euyOlEIgOL/15o1abNdPDTAkEA7oa5Sd6RZZMn60rQ3K9Ut7Myu6sopUcaoLgeB9YFLby8s4tcsZOhtvpVby4xdEvUX+mJWBacDEOZDAm1CRiWdQJAWpj+0ebwoOcOk3avYWjj9L2zdbAYUp7T8xDODIbqBE2Jqn5ngt6nIpvNC/qJ4tTu/67BGzmQdA5oB3eEG2XCsQJAQinkQqRb42t+yn7AbKm5vx9kFs0r3wlBYihYguM5HU/W2HYS5iyY1r2EmYpaJiHrKGXnND61w3N0k8GSMVD7uA==";
    private static final String URL_PARAM = "?authType=jwt&param=%s";

    /**
     * TODO 需要替換為客戶訪問領星ERP系統(tǒng)的域名,SAAS客戶統(tǒng)一為 https://erp.lingxing.com,獨立部署客戶需要替換為自己的服務域名
     * 如果需要登錄默認進入指定菜單,請攜帶具體路徑
     * eg: 默認進入用戶管理頁面, https://erp.lingxing.com/erp/muser/userManage
     */
    private static final String DOMAIN = "https://erp.lingxing.com";

    // TODO 需要替換為配置在ERP系統(tǒng)的驗簽密鑰字段值 (菜單路徑:設置/業(yè)務配置/全局/單點登錄設置:驗簽密鑰)
    private static final String SIGN_KEY = "387e98090e064129886e959a94f7aea2";

    // TODO 需替換為配置在ERP系統(tǒng)的企業(yè)唯一標識值 (菜單路徑:設置/業(yè)務配置/全局/單點登錄設置:企業(yè)唯一標識)
    private static final String CLIENT_ID = "4B008083446B05FAE42589CEEEBD611A ";

    // TODO 如果需要指定當前jwtToken的過期時間,請手動調整此項值
    public static final Long EXPIRE_TIME = 3600L;//過期時間,單位秒,默認一小時

    public static void main(String[] args) {
        // TODO 用戶信息需替換為本系統(tǒng)的用戶數據
        String uniqueKey = "userId001";
        String mobile = "10000";
        String email = "lingxingUser@lingxing.com";
        String username = "lingxingUser";
        String realname = "領星用戶";

        String redirectUrl = getRedirectUrl(uniqueKey, mobile, email, username, realname);
        System.out.println("redirectUrl:" + redirectUrl);
    }

    /**
     * 獲取重定向到領星ERP系統(tǒng)的地址
     * @param uniqueKey
     * @param mobile
     * @param email
     * @param username
     * @param realname
     * @return
     */
    public static String getRedirectUrl(String uniqueKey, String mobile, String email, String username, String realname ){
        String jwtToken = createJWTToken(uniqueKey, mobile, email, username, realname);
        String jwtSSOLoginParam = encodeJwtSSOLoginParam(CLIENT_ID, jwtToken);
        return DOMAIN + String.format(URL_PARAM, jwtSSOLoginParam);
    }


    /**
     * 加密單點登錄入參內容
     * @param clientId 企業(yè)唯一標識
     * @param jwtToken token信息
     * @return
     */
    private static String encodeJwtSSOLoginParam(String clientId, String jwtToken) {
        Map<String, Object> param = new HashMap<>();
        param.put("jwtToken", jwtToken);
        param.put("clientId", clientId);
        return encrypt(JSON.toJSONString(param), PRIVATE_KEY);
    }

    /**
     * 生成JWT-TOKEN
     * @return
     */
    private static String createJWTToken(String uniqueKey, String mobile, String email, String username, String realname) {
        Map<String, Object> header = new HashMap<>();
        header.put("type", "JWT");
        header.put("alg","HS256");
        Date exp = new Date(new Date().getTime() + EXPIRE_TIME * 1000);
        return JWT.create()
                .withHeader(header)
                .withSubject(uniqueKey)
                .withExpiresAt(exp)
                .withClaim("mobile", mobile)
                .withClaim("email", email)
                .withClaim("username", username)
                .withClaim("realname", realname)
                .withClaim("timestamp", System.currentTimeMillis())
                .sign(Algorithm.HMAC256(SIGN_KEY));
    }

    /**
     * RSA加密 - 私鑰分段加密
     * @param content
     * @param privateKeyStr
     * @return
     */
    private static String encrypt(String content, String privateKeyStr) {
        try {
            // 獲取私鑰
            PrivateKey privateKey = getPrivateKey(privateKeyStr);
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            // URLEncoder編碼解決中文亂碼問題
            byte[] data = URLEncoder.encode(content, "UTF-8").getBytes("UTF-8");
            // 加密時超過117字節(jié)就報錯。為此采用分段加密的辦法來加密
            byte[] enBytes = null;
            for (int i = 0; i < data.length; i += 117) {
                // 注意要使用2的倍數,否則會出現加密后的內容再解密時為亂碼
                byte[] doFinal = cipher.doFinal(subarray(data, i, i + 117));
                enBytes = addAll(enBytes, doFinal);
            }
            return Base64.getEncoder().encodeToString(enBytes).replaceAll("\\+", "-").replaceAll("/", "_").replaceAll("=", "");
        } catch(Exception e) {
            throw new RuntimeException("UC-RSA加密出錯");
        }
    }

    /**
     * 將base64編碼后的私鑰字符串轉成PrivateKey實例
     * @param privateKey 私鑰
     * @return PrivateKey實例
     * @throws Exception 異常信息
     */
    private static PrivateKey getPrivateKey(String privateKey) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(privateKey);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(keySpec);
    }

    private static byte[] subarray(byte[] array, int startIndexInclusive, int endIndexExclusive) {
        if (array == null) {
            return null;
        } else {
            if (startIndexInclusive < 0) {
                startIndexInclusive = 0;
            }

            if (endIndexExclusive > array.length) {
                endIndexExclusive = array.length;
            }

            int newSize = endIndexExclusive - startIndexInclusive;
            if (newSize <= 0) {
                return new byte[0];
            } else {
                byte[] subarray = new byte[newSize];
                System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
                return subarray;
            }
        }
    }

    private static byte[] addAll(byte[] array1, byte... array2) {
        if (array1 == null) {
            return clone(array2);
        } else if (array2 == null) {
            return clone(array1);
        } else {
            byte[] joinedArray = new byte[array1.length + array2.length];
            System.arraycopy(array1, 0, joinedArray, 0, array1.length);
            System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
            return joinedArray;
        }
    }

    private static byte[] clone(byte[] array) {
        return array == null ? null : (byte[])array.clone();
    }

}

3. 用戶需要替換的變量

變量名稱

是否必填

變量說明

值來源

DOMAIN

訪問ERP系統(tǒng)的域名

(例如: http://erp.lingxing.com)

客戶訪問ERP系統(tǒng)的地址

SIGN_KEY

驗簽密鑰

客戶在ERP系統(tǒng)配置內容

CLIENT_ID

企業(yè)唯一標識

客戶在ERP系統(tǒng)配置內容

EXPIRE_TIME

jwt-token過期時間(默認3600秒)

客戶自定義

uniqueKey

客戶企業(yè)用戶唯一標識(不可變)

客戶系統(tǒng)內部用戶數據

mobile

用戶手機號

客戶系統(tǒng)內部用戶數據

email

用戶郵箱

客戶系統(tǒng)內部用戶數據

username

用戶名

客戶系統(tǒng)內部用戶數據

realname

真實姓名

客戶系統(tǒng)內部用戶數據

注意事項:

1、使用企業(yè)用戶唯一標識字段(uniqueKey):建議設置為您系統(tǒng)的唯一且不可變的字段,例如用戶ID。用戶初次映射成功后,后續(xù)變更了用戶基本信息(手機號/郵箱/用戶名),依舊會通過獲取初次映射的uniqueKey對應的用戶數據進行單點登錄。
2、客戶基本信息(mobile/email/username): 當企業(yè)JWT配置中設置手機號為用戶唯一性映射字段時,手機號便不允許為空,其余字段同理。

3.2 基于領星SDK實現

1、pom引入JWT依賴包

SDK下載地址

<dependency>
  <groupId>com.asinking.cloud</groupId>
  <artifactId>lingxing-sso-sdk</artifactId>
  <version>1.0.0.RELEASE</version>
</dependency>

2、Java示例代碼

package com.asinking.uc.sso;

import com.asinking.uc.sso.bean.JwtSSOLoginDTO;
import com.asinking.uc.sso.exception.SSOLoginException;
import com.asinking.uc.sso.service.JWTLoginClient;

public class Main {
    public static void main(String[] args){
        JWTLoginClient client = new JWTLoginClient();
        JwtSSOLoginDTO loginDTO = JwtSSOLoginDTO.builder()
                .domain("http://erp.lingxing.com")
                .signKey("c53cd1b05f494402a3727019f2dee028")
                .clientId("1FA748ECE9921E4EC26CD6540E90DE6C")
                .expireMilliseconds(3600000L)
                .uniqueKey("10000000")
                .mobile("10000")
                .email("lingxingerp@lingxing.com")
                .username("lingxingerp")
                .realName("領星ERP用戶")
                .build();
        String redirectUrl = null;
        try {
            redirectUrl = client.getRedirectUrl(loginDTO);
        } catch (SSOLoginException e) {
            // TODO 異常處理
        }
        System.out.println(redirectUrl);
    }

}

3. 客戶需要替換的變量

變量名稱

是否必填

變量說明

值來源

domain

訪問ERP系統(tǒng)的域名

(例如: http://erp.lingxing.com)

客戶訪問ERP系統(tǒng)的地址

signKey

驗簽密鑰

客戶在ERP系統(tǒng)配置內容

clientId

企業(yè)唯一標識

客戶在ERP系統(tǒng)配置內容

expireMilliseconds

jwt-token過期時間(默認3600秒)

客戶自定義

uniqueKey

客戶企業(yè)用戶唯一標識(不可變)

客戶系統(tǒng)內部用戶數據

mobile

用戶手機號

客戶系統(tǒng)內部用戶數據

email

用戶郵箱

客戶系統(tǒng)內部用戶數據

username

用戶名

客戶系統(tǒng)內部用戶數據

realname

真實姓名

客戶系統(tǒng)內部用戶數據

4、單點登錄領星ERP系統(tǒng)

打開新的瀏覽器頁簽,單點登錄領星ERP系統(tǒng)(需要更換為自己的域名,以下為SAAS登錄示例)

http://erp.lingxing.com?authType=jwt&param={param}

示例:

http://erp.lingxing.com?authType=jwt&param=NmI79VpmUjPY0DYCTulCv-HhNqfEKVt163Xd5PNa-CC20eNMj_mmPXcpfLe_c5eFTAfaQkYVxavKFjn0zqHJNi7xFaX21e_T3Or5zjH6KOB8uROzTGOQFoWdZRc9zu15bbNgic9xZUjZTFFH8s-h6766-RjGQ0dtAJQi56MI60Zwejco1lqXlPaMaJShbbY2i49cwvyYpbsGKYd13_W2icM6iz96i6slaES4HBaB6ok7-Ilg1D5t-jW8w5JqGD3NCyK5kpVvOSxsyweoJXbqWukc_gvWNDqP0OE6-wnzuYJvnExzwA7Fyxg5VcXoe4QgVwEfLiGIy3k7l_8YpkrKfQulVYccwDZxtyqaW3dMyAaJzg-ID-Xmz6q2OhtJ-xaxKO8MWaHmnPYhtNJdFHDWPmszPdBjiIOBh-zEhgS5xhovlT-ZXgktG0pqegfZRwuMlmTlpB226fQ3YvvMP_qs13Zc_aki45QCKXVlYUdYRhYgtPlnww4SO74Gl2jRZDkr

 

 
 

未能解決你的問題?請聯(lián)系在線客服

上一篇
全局標簽
下一篇
財務-結算賬戶
本文是否對您有幫助?
有幫助
無幫助