1. 程式人生 > >sso單點登入系統

sso單點登入系統

1 課程計劃

第十一天:

  1. sso註冊功能實現
  2. sso登入功能實現
  3. 通過token獲得使用者資訊
  4. Ajax跨域請求(jsonp)
     

2 Sso系統工程搭建

需要建立一個sso服務工程,可以參考e3-manager建立。

e3-sso(pom聚合工程)

   |--e3-sso-interface(jar)

   |--e3-sso-Service(war)

e3-sso-web

複製pom檔案依賴到e3-sso工程:

 <dependencies>
        <dependency>
            <groupId>cn.e3mall</groupId>
            <artifactId>e3-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
  </dependencies>
  <!-- 配置tomcat外掛 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <path>/</path>
                    <port>8087</port>
                </configuration>
            </plugin>
        </plugins>
    </build>

複製pom檔案依賴到e3-sso-interface工程:

<dependencies>
        <dependency>
            <groupId>cn.e3mall</groupId>
            <artifactId>e3-manager-pojo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

複製pom檔案依賴到e3-sso-service工程:

<dependencies>
        <dependency>
            <groupId>cn.e3mall</groupId>
            <artifactId>e3-manager-dao</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cn.e3mall</groupId>
            <artifactId>e3-sso-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- spring的依賴 -->
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!-- dubbo相關 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <exclusions>
                <!-- 排除dubbo自帶的spring 防止衝突 -->
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <!-- 排除dubbo自帶的netty 防止衝突 -->
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
    </dependencies>

複製配置檔案到e3-sso-service工程:

1.清空resource.properties內容

2.修改applicationContext-service.xml配置檔案:

3.建立包:

4.修改applicationContext-trans.xml事務配置檔案:

5.複製web.xml檔案到e3-sso-service工程:

複製pom檔案依賴到e3-sso-web工程:

  <dependencies>
          <dependency>
            <groupId>cn.e3mall</groupId>
            <artifactId>e3-sso-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
          <!-- JSP相關 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- spring的依賴 -->
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!-- dubbo相關 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
  </dependencies>
  <build>
        <plugins>
            <!-- 配置Tomcat外掛 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <path>/</path>
                    <port>8088</port>
                </configuration>
            </plugin>
        </plugins>
    </build>

1.複製配置檔案到e3-sso-web工程:

2.清空resource.properties配置檔案

3.修改springmvc.xml配置檔案:

4.建立包:

5複製web.xml檔案:

加入登入註冊靜態頁面到e3-sso-web工程:

根絕頁面請求方式修改web.xml攔截方式:

修改springmvc.xml配置靜態資源對映:

安裝e3-sso工程

3 服務介面實現

3.1 檢查資料是否可用

3.1.1 功能分析

請求的url:/user/check/{param}/{type}

引數:從url中取引數1、String param(要校驗的資料)2、Integer type(校驗的資料型別)

響應的資料:json資料。e3Result,封裝的資料校驗的結果true:成功false:失敗。

業務邏輯:

  1. 從tb_user表中查詢資料
  2. 查詢條件根據引數動態生成。
  3. 判斷查詢結果,如果查詢到資料返回false。
  4. 如果沒有返回true。
  5. 使用e3Result包裝,並返回。

3.1.2 Dao層

從tb_user表查詢。可以使用逆向工程。

3.1.3 Service

引數:

  1. 要校驗的資料:String param
  2. 資料型別:int type(1、2、3分別代表username、phone、email)

返回值:e3Result

@Service

public class UserServiceImpl implements UserService {

 

      @Autowired

      private TbUserMapper userMapper;

     

      @Override

      public e3Result checkData(String param, int type) {

            // 1、從tb_user表中查詢資料

            TbUserExample example = new TbUserExample();

            Criteria criteria = example.createCriteria();

            // 2、查詢條件根據引數動態生成。

            //1、2、3分別代表username、phone、email

            if (type == 1) {

                  criteria.andUsernameEqualTo(param);

            } else if (type == 2) {

                  criteria.andPhoneEqualTo(param);

            } else if (type == 3) {

                  criteria.andEmailEqualTo(param);

            } else {

                  return e3Result.build(400, "非法的引數");

            }

            //執行查詢

            List<TbUser> list = userMapper.selectByExample(example);

            // 3、判斷查詢結果,如果查詢到資料返回false。

            if (list == null || list.size() == 0) {

                  // 4、如果沒有返回true。

                  return e3Result.ok(true);

            }

            // 5、使用e3Result包裝,並返回。

            return e3Result.ok(false);

      }

 

}

釋出服務

3.1.4 表現層

需要在e3-sso-web中實現。

引用服務

Controller

請求的url:/user/check/{param}/{type}

引數:從url中取引數1、String param(要校驗的資料)2、Integer type(校驗的資料型別)

響應的資料:json資料。e3Result,封裝的資料校驗的結果true:成功false:失敗。

@Controller

public class UserController {

 

      @Autowired

      private UserService userService;

     

      @RequestMapping("/user/check/{param}/{type}")

      @ResponseBody

      public e3Result checkData(@PathVariable String param, @PathVariable Integer type) {

            e3Result e3Result = userService.checkData(param, type);

            return e3Result;

      }

}

3.2 使用者註冊

3.2.1 功能分析

請求的url:/user/register

引數:表單的資料:username、password、phone、email

返回值:json資料。e3Result

接收引數:使用TbUser物件接收。

請求的方法:post

業務邏輯:

  1. 使用TbUser接收提交的請求。
  2. 補全TbUser其他屬性。
  3. 密碼要進行MD5加密。
  4. 把使用者資訊插入到資料庫中。
  5. 返回e3Result。

3.2.2 Dao層

可以使用逆向工程。

3.2.3 Service層

引數:TbUser

返回值:e3Result

@Override

      public e3Result createUser(TbUser user) {

            // 1、使用TbUser接收提交的請求。

           

            if (StringUtils.isBlank(user.getUsername())) {

                  return e3Result.build(400, "使用者名稱不能為空");

            }

            if (StringUtils.isBlank(user.getPassword())) {

                  return e3Result.build(400, "密碼不能為空");

            }

            //校驗資料是否可用

            e3Result result = checkData(user.getUsername(), 1);

            if (!(boolean) result.getData()) {

                  return e3Result.build(400, "此使用者名稱已經被使用");

            }

            //校驗電話是否可以

            if (StringUtils.isNotBlank(user.getPhone())) {

                  result = checkData(user.getPhone(), 2);

                  if (!(boolean) result.getData()) {

                        return e3Result.build(400, "此手機號已經被使用");

                  }

            }

            //校驗email是否可用

            if (StringUtils.isNotBlank(user.getEmail())) {

                  result = checkData(user.getEmail(), 3);

                  if (!(boolean) result.getData()) {

                        return e3Result.build(400, "此郵件地址已經被使用");

                  }

            }

            // 2、補全TbUser其他屬性。

            user.setCreated(new Date());

            user.setUpdated(new Date());

            // 3、密碼要進行MD5加密。

            String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());

            user.setPassword(md5Pass);

            // 4、把使用者資訊插入到資料庫中。

            userMapper.insert(user);

            // 5、返回e3Result

            return e3Result.ok();

      }

釋出服務

3.2.4 表現層

引用服務。

 

Controller:

請求的url:/user/register

引數:表單的資料:username、password、phone、email

返回值:json資料。e3Result

接收引數:使用TbUser物件接收。

請求的方法:post

@RequestMapping(value="/user/register", method=RequestMethod.POST)

      @ResponseBody

      public e3Result register(TbUser user) {

            e3Result result = userService.createUser(user);

            return result;

      }

3.2.5 測試

可以使用restclient-ui-3.5-jar-with-dependencies.jar測試介面。

表單提交的content-type:application/x-www-form-urlencoded

3.3 使用者登入

3.3.1 功能分析

請求的url:/user/login

請求的方法:POST

引數:username、password,表單提交的資料。可以使用方法的形參接收。

返回值:json資料,使用e3Result包含一個token。

業務邏輯:

登入的業務流程:

登入的處理流程:

  1. 登入頁面提交使用者名稱密碼。
  2. 登入成功後生成token。Token相當於原來的jsessionid,字串,可以使用uuid。
  3. 把使用者資訊儲存到redis。Key就是token,value就是TbUser物件轉換成json。
  4. 使用String型別儲存Session資訊。可以使用“字首:token”為key
  5. 設定key的過期時間。模擬Session的過期時間。一般半個小時。
  6. 把token寫入cookie中。
  7. Cookie需要跨域。例如www.e3.com\sso.e3.com\order.e3.com,可以使用工具類。
  8. Cookie的有效期。關閉瀏覽器失效。
  9. 登入成功。

註冊成功後去登入:

手動選擇去登入:

LoginController:

 

 

不能使用userid作為redis快取的key,換臺電腦userid相同,但因為換了電腦,使用者並沒有登入。不能判斷出使用者是否登入。

應該和tomcat session一樣,使用sessionid作為key,把sessionid存入cookie中。每次服務端從cookie中取sessionid去redis中查詢,判斷使用者是否登入和是否過期,如果沒過期需要重置過期時間。key是sessionid(圖中的token),使用uuid生成key不會重複,value是使用者資訊。需要和session一樣設定過期時間。

加入redis依賴:

新增redis配置檔案:

3.3.2 Dao層

查詢tb_user表。單表查詢。可以使用逆向工程。

3.3.3 Service層

resource.properties:

引數:

  1. 使用者名稱:String username
  2. 密碼:String password

返回值:e3Result,包裝token。

業務邏輯:

1、判斷使用者名稱密碼是否正確。

2、登入成功後生成token。Token相當於原來的jsessionid,字串,可以使用uuid。

3、把使用者資訊儲存到redis。Key就是token,value就是TbUser物件轉換成json。

4、使用String型別儲存Session資訊。可以使用“字首:token”為key

5、設定key的過期時間。模擬Session的過期時間。一般半個小時。

6、返回e3Result包裝token。

@Override

      public e3Result login(String username, String password) {

            // 1、判斷使用者名稱密碼是否正確。

            TbUserExample example = new TbUserExample();

            Criteria criteria = example.createCriteria();

            criteria.andUsernameEqualTo(username);

            //查詢使用者資訊

            List<TbUser> list = userMapper.selectByExample(example);

            if (list == null || list.size() == 0) {

                  return e3Result.build(400, "使用者名稱或密碼錯誤");

            }

            TbUser user = list.get(0);

            //校驗密碼

            if (!user.getPassword().equals(DigestUtils.md5DigestAsHex(password.getBytes()))) {

                  return e3Result.build(400, "使用者名稱或密碼錯誤");

            }

            // 2、登入成功後生成token。Token相當於原來的jsessionid,字串,可以使用uuid

            String token = UUID.randomUUID().toString();

            // 3、把使用者資訊儲存到redis。Key就是token,value就是TbUser物件轉換成json

            // 4、使用String型別儲存Session資訊。可以使用“字首:token”為key

            user.setPassword(null);

            jedisClient.set(USER_INFO + ":" + token, JsonUtils.objectToJson(user));

            // 5、設定key的過期時間。模擬Session的過期時間。一般半個小時。

            jedisClient.expire(USER_INFO + ":" + token, SESSION_EXPIRE);

            // 6、返回e3Result包裝token。

            return e3Result.ok(token);

      }

釋出服務

3.3.4 表現層

引用服務:

Controller

請求的url:/user/login

請求的方法:POST

引數:username、password,表單提交的資料。可以使用方法的形參接收。

HttpServletRequest、HttpServletResponse

返回值:json資料,使用e3Result包含一個token。

業務邏輯:

      1.接收兩個引數。

      2.呼叫Service進行登入。

      3.從返回結果中取token,寫入cookie。Cookie要跨域。

Cookie二級域名跨域需要設定:

1)setDomain,設定一級域名:

.itcatst.cn

.e3.com

.e3.com.cn

2)setPath。設定為“/”

 

工具類放到e3-common工程中(工具類的編碼指的是中文轉碼)。

      4.響應資料。Json資料。e3Result,其中包含Token。

@RequestMapping(value="/user/login", method=RequestMethod.POST)

      @ResponseBody

      public e3Result login(String username, String password,

                  HttpServletRequest request, HttpServletResponse response) {

            // 1、接收兩個引數。

            // 2、呼叫Service進行登入。

            e3Result result = userService.login(username, password);

            // 3、從返回結果中取token,寫入cookie。Cookie要跨域。

            String token = result.getData().toString();

            CookieUtils.setCookie(request, response, COOKIE_TOKEN_KEY, token);

            // 4、響應資料。Json資料。e3Result,其中包含Token。

            return result;

           

      }

安裝e3-common工程和e3-sso-interface工程

實現首頁登入註冊:

相關推薦

SpringBoot+MyBatis+Redis實現SSO登入系統(二)

SpringBoot+MyBatis+Redis實現SSO單點登入系統(二)   三、程式碼 配置檔案配置資料庫,redis等相關的資訊。 # See http://docs.spring.io/spring-boot/docs/current/reference/html

SpringBoot+MyBatis+Redis實現SSO登入系統(一)

SpringBoot+MyBatis+Redis實現SSO單點登入系統(一)   一、SSO系統概述        SSO英文全稱Single Sign On,單點登入。SSO是在多個應用系統中,使用者只需要

sso登入系統

1 課程計劃 第十一天: sso註冊功能實現 sso登入功能實現 通過token獲得使用者資訊 Ajax跨域請求(jsonp)   2 Sso系統工程搭建 需要建立一個sso服務工程,可以參考e3-manager建立。 e3-

網際網路分散式微服務雲平臺規劃分析--SSO登入系統

介紹 鴻鵠雲架構【SSO單點登入系統】為所有微服務提供統一的使用者認證服務,系統本身屬於微服務模式,使用JWT+Redis分散式儲存方案,確保不同微服務、系統之間的安全通訊和統一使用者校驗、認證。在整個服務平臺中起著使用者樞紐中心的作用。 平臺基礎功能 使用者註冊&登入、使用者登

(六)Honghu Cloud鴻鵠雲架構一SSO登入系統

產品簡介 鴻鵠雲架構【SSO單點登入系統】為所有微服務提供統一的使用者認證服務,系統本身屬於微服務模式,使用JWT+Redis分散式儲存方案,確保不同微服務、系統之間的安全通訊和統一使用者校驗、認證。在整個服務平臺中起著使用者樞紐中心的作用。   功能清單 使用者註冊&am

SSO登入系統的設計與實現

        之前在專案中用到了單點登入系統來解決分散式環境中Session共享的問題,趁著現在閒了,總結一下......什麼是sso系統        SSO英文全稱Single Sign On,單點登入。SSO是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信

sso登入系統(解決session共享)

場景:假設一個使用者將自己的登入資訊提交到後臺,如果session儲存的資訊分佈在多臺機器上,並且不共享,那麼可能導致使用者的登入資訊出現短暫的丟失,為什麼這樣講,因為使用者訪問伺服器中間還要經過負載均衡伺服器,負載均衡採用輪詢的方式轉發使用者的登入請求。有可能訪問到的那臺

SSO登入系統原理分析及功能實現

Sso系統分析什麼是sso系統SSO英文全稱Single Sign On,單點登入。SSO是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登入對映到其他應用中用於同一個使用者的登入的機制。它是目前比較流行的企業業務整合的解決方案

淘淘商城61-SSO登入系統之安全退出介面開發

目錄 1.分析介面文件 從介面文件可知 url:user/logout/{token} 引數:token 返回值:由TaotaoResule封裝的資訊"OK" 2.安全退出介面開發 2.1表現層 2.1.1dao層 直接使

SSO登入系統分析

專案構建 e3-sso(pom 聚合工程) |--e3-sso-interface(jar) |--e3-sso-Service(war) e3-sso-web 服務介面實現 檢查資料是否可用(RegitsterController) 請求的 url:/

淘淘商城59-SSO登入系統之使用者登入介面開發

目錄 1.分析介面文件 請求的url:/user/login 請求的方法:POST 引數:username、password。 返回值:json資料,使用TaotaoResult包含一個token。 2.登入介面實現

微服務專案中如何整合——XXL-SSO登入系統

為什麼需要做單點登陸系統 大型網際網路公司中,公司旗下可能會有多個子系統,每個登陸實現統一管理 多個賬戶資訊統一管理 SSO

SSO(Single Sign On)登入系統

SSO(Single Sign On)單點登入系統 1.登入 @Controller public class LoginController { @Autowired private LoginService loginService; @Value("${TOKEN_

SSO登入系統

一、單點登入系統介紹   對於一個開發專案來說,每個專案都必不可少要有登入的這個功能。但是隨著專案的變大,變大,再變大。系統可能會被拆分成多個小系統,咱們就拿支付寶和淘寶來說,咱們在淘寶上購物,然後就可以直接連線到自己的支付寶,這個過程不需要我們再次登入系統,自動就完成了跳轉。這個操作就是小編這次向大家介紹

(十三)java springboot b2b2c多使用者商城系統分析 - SSO登入之OAuth2.0 根據token獲取使用者資訊(4)

上一篇我根據框架中OAuth2.0的使用總結,畫了SSO單點登入之OAuth2.0 登出流程,今天我們看一下根據使用者token獲取yoghurt資訊的流程: ​ /** * 根據token獲取使用者資訊 * @param accessToken * @return * @

(十二)java springboot b2b2c shop 多使用者商城系統原始碼- SSO登入之OAuth2.0 登出流程(3)

上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */

(十一)JAVA springboot ssm b2b2c多使用者商城系統 - SSO登入之OAuth2.0登入流程(2)

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是為了快速幫助大家認識OAuth2.0,閒話少說,我根據框架中OAuth2.0的使用總結,畫了一個簡單的流程圖(根據使用者名稱+密碼實現OAuth2.0的登入認證):        上面的圖很清

(十二)JAVA springcloud ssm b2b2c多使用者商城系統原始碼-SSO登入之OAuth2.0 登出流程(3)

上一篇我根據框架中OAuth2.0的使用總結,畫了一個根據使用者名稱+密碼實現OAuth2.0的登入認證的流程圖,今天我們看一下logout的流程: /** * 使用者登出 * @param accessToken * @return */ @R

登入系統(SSO)的實現

一、SSO技術簡介 1、基本介紹         目前的企業應用環境中,往往有很多的應用系統,如辦公自動化(OA)系統,財務管理系統,檔案管理系統,資訊查詢系統等等。這些應用系統服務於企業的資訊化建設,為企業帶來了很好的效益。但是,使用者在使用這些應用系統時,並不方便。使

統一認證管理系統登入系統sso 淺談

        我所在的公司比較大,內部的各種管理系統和業務系統比較多,然而所有的系統都可以用公司的OA的員工工號和密碼直接進行登入 (當然登入介面都是一個就是內部OA門戶)。從進入公司以來我就一直有個問題,這是怎麼做到的?畢竟假如每個系統一套資料庫,那麼所有的系統都得同步O