1. 程式人生 > >SSO單點登入系統分析

SSO單點登入系統分析

專案構建

e3-sso(pom 聚合工程)
|--e3-sso-interface(jar)
|--e3-sso-Service(war)
e3-sso-web

服務介面實現

檢查資料是否可用(RegitsterController)

請求的 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 包裝,並返回。

/**
     * 使用者校驗 註冊引數
     * @param param 1:使用者名稱 2:手機號 3:郵箱
     * @param type 1 ,2 ,3
     * @return
     */
    @RequestMapping("/user/check/{param}/{type}")
    @ResponseBody
    public E3Result checkData(@PathVariable String param, @PathVariable Integer type) {
        E3Result e3Result = registerService.checkData(param, type
); return e3Result; }

使用者註冊(RegitsterController)

請求的 url:/user/register
引數:表單的資料:username、password、phone、email
返回值:json 資料。e3Result
接收引數:使用 TbUser 物件接收。
請求的方法:post
業務邏輯:
1、使用 TbUser 接收提交的請求。
2、補全 TbUser 其他屬性。
3、密碼要進行 MD5 加密。
4、把使用者資訊插入到資料庫中。
5、返回 e3Result。

/**
     * 使用者註冊
     * @param
user * @return */
@RequestMapping(value="/user/register", method=RequestMethod.POST) @ResponseBody public E3Result register(TbUser user) { E3Result e3Result = registerService.register(user); return e3Result; }

使用者登入

請求的 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、登入成功。

/**
 * 使用者登入處理
 * <p>Title: LoginController</p>
 * <p>Description: </p>
 * @version 1.0
 */
@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;

    @Value("${TOKEN_KEY}")
    private String TOKEN_KEY;

    /**
     * 使用者登入請求
     * @param username
     * @param password
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/user/login", method=RequestMethod.POST)
    @ResponseBody
    public E3Result login(String username, String password,
            HttpServletRequest request, HttpServletResponse response) {
        E3Result e3Result = loginService.userLogin(username, password);
        //判斷是否登入成功
        if(e3Result.getStatus() == 200) {// 登入成功,將token寫入cookie
            String token = e3Result.getData().toString();
            //如果登入成功需要把token寫入cookie
            CookieUtils.setCookie(request, response, TOKEN_KEY, token);
        }
        //返回結果
        return e3Result;
    }
}

表現層

請求的 url:/user/login
請求的方法:POST
引數:username、password,表單提交的資料。可以使用方法的形參接收。
HttpServletRequest、HttpServletResponse
返回值:json 資料,使用 e3Result 包含一個 token。
業務邏輯:
1、接收兩個引數。
2、呼叫 Service 進行登入。
3、從返回結果中取 token,寫入 cookie。Cookie 要跨域

/**
     * 跳轉到登陸頁
     * @param redirect 重定向URI
     * @param model
     * @return
     */
    @RequestMapping("/page/login")
    public String showLogin(String redirect, Model model) {
        model.addAttribute("redirect", redirect);
        return "login";
    }

通過 token 查詢使用者資訊

請求的 url:/user/token/{token}
引數:String token 需要從 url 中取。
返回值:json 資料。使用 e3Result 包裝 Tbuser 物件。
業務邏輯:
1、從 url 中取引數。
2、根據 token 查詢 redis。
3、如果查詢不到資料。返回使用者已經過期。
4、如果查詢到資料,說明使用者已經登入。
5、需要重置 key 的過期時間。
6、把 json 資料轉換成 TbUser 物件,然後使用 e3Result 包裝並返回。

/**
     * 根據token查詢使用者資訊
     * @param token
     * @param callback
     * @return
     */
    @RequestMapping(value="/user/token/{token}")
    @ResponseBody
    public Object getUserByToken(@PathVariable String token, String callback) {
        E3Result result = tokenService.getUserByToken(token);
        //響應結果之前,判斷是否為jsonp請求
        if (StringUtils.isNotBlank(callback)) {
            //把結果封裝成一個js語句響應
            MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
            mappingJacksonValue.setJsonpFunction(callback);
            return mappingJacksonValue;
        }
        return result;
    }