1. 程式人生 > >javaWeb簡單的單點登入sso實現方法

javaWeb簡單的單點登入sso實現方法

總結一個簡單的sso單點登入實現方法,先上一張思路圖:

思路不復雜,在一個Filter中如下:

String baseUrl="你的基礎系統路徑";//比如是120.24.270.95:8080
	String host=request.getHeader("HOST");
	String url=request.getRequestURI();
	if(request.getQueryString()!=null){
		url=url+"?"+request.getQueryString();
	}
	/***********單點登入***********/
	if(session.getAttribute(session_user_KEY)==null){//獲取session中使用者的登入資訊
		String sso=request.getParameter("sso");
		if(sso!=null && sso.equals("1")){//sso標記
			String userName=request.getParameter("userName");
			String password=request.getParameter("password");
			ssoLoginSrv.login(userName, password, request);//如果有sso標記,獲取引數中的使用者名稱和密碼,判斷是否合法,合法則可免登。
		}else{		/*加上sso標誌*/
			if(ex.indexOf("?")>0){
				ex=ex+"&sso=1";
			}else{
				ex=ex+"?sso=1";
			}
			//帶著url轉發到基礎系統
			response.sendRedirect(baseUrl+"/loginAction!login.do?url="
						+ URLEncoder.encode("http://" + host + url, "utf8"));
			return;
			}
	}


轉發到基礎系統,如果基礎系統已登入,則子系統可實現免登,

是Action中的一個方法,執行完帶著使用者名稱密碼轉回去,

如下方法:

public String login(){	
	Map session=ActionContext.getContext().getSession();
	User loginUser=(User)session.get(session_user_KEY);
	try{
		if(loginUser==null){			
			loginUser=userSrv.login(user.getUserName(), user.getPassword());
		}
	}catch (Exception e) {
		log.error(e.getMessage());
		this.setMsg(e.getMessage());
		return "loginNo";
	}
	if(isNull(url)){
		url="/index.jsp";
	}else if(url.indexOf("sso=1")>0){
		String str1=DesUtil.encode(loginUser.getUserName(), ssoLoginPwdKey, "utf8");
		String str2=DesUtil.encode(loginUser.getPassword(),ssoLoginPwdKey, "utf8");
		url=url+"&userName="+str1+"&password="+str2;
	}		
	return "loginOk";
}
在strust.xml中配置轉發到url,帶著使用者名稱密碼回到一開始的子系統,還是被Filter攔截。

再次進入子系統Filter的時候,拿到sso標記,和使用者名稱密碼,驗證是否合法,合法則往下執行,不合法跳轉到登入頁面。

歡迎掃碼關注微信公眾號:擒賊先情王(qingshang733)