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;
}