JeeSite 已經(jīng)默認集成了兩種單點(diǎn)登錄方式(Single Sign On):
1、SSO(簡(jiǎn)單登錄)接口,實(shí)現快速登錄系統。
2、與 Apereo CAS 服務(wù)器集成,快速實(shí)現系統登錄(個(gè)人版)
并實(shí)現了第三方登錄 OAuth2,如:微信、QQ、支付寶、等等
1、設置 application.yml(v4.0.x:jeesite.yml)的 shiro.sso.secretKey 快速登錄安全Key,若不設置將無(wú)法使用該接口。
shiro: # 簡(jiǎn)單 SSO 登錄相關(guān)配置 sso: # 如果啟用/sso/{username}/{token}單點(diǎn)登錄,請修改此安全key并與單點(diǎn)登錄系統key一致。 secretKey: thinkgem # 是否加密單點(diǎn)登錄安全Key encryptKey: true2、舉例調用地址如下,調用完成后自動(dòng)登錄系統:
http://localhost/project/sso/{username}/{token}?url=/sys/user/list?p1=v1%26p2=v2&relogin=truetoken生成方式:
String username = "system"; // 登錄系統名String secretKey = "thinkgem"; // yml 中設置的 shiro.sso.secretKey 參數值。String token = Md5Utils.md5(secretKey + username + DateUtils.getDate("yyyyMMdd"));// 如果 shiro.sso.encryptKey 為 true,則 secretKey 會(huì )自動(dòng)加密。// 如果在本系統獲取,則 secretKey 已經(jīng)加密了,也可以通過(guò)下面這個(gè)簡(jiǎn)便方法獲取。String token = UserUtils.getSsoToken(username);該接口源碼如下(提供參考):
/** * 單點(diǎn)登錄(如已經(jīng)登錄,則直接跳轉) * @param username 登錄用戶(hù)名(loginCode) * @param token 單點(diǎn)登錄令牌,令牌組成:sso密鑰+用戶(hù)名+日期,進(jìn)行md5加密,舉例: * // 注意如果 shiro.sso.encryptKey 為 true,則 secretKey 會(huì )自動(dòng)加密。 * String secretKey = Global.getConfig("shiro.sso.secretKey"); * String token = Md5Utils.md5(secretKey + username + DateUtils.getDate("yyyyMMdd")); * @param params 登錄附加參數(JSON格式),或 param_ 前綴的請求參數。 * @param url 登錄成功后跳轉的url地址。 * @param relogin 是否強制重新登錄,需要強制重新登錄傳遞true */@RequestMapping(value = "sso/{username}/{token}")public String sso(@PathVariable String username, @PathVariable String token, @RequestParam(defaultValue="${adminPath}") String url, String relogin, HttpServletRequest request, Model model){ User user = UserUtils.getUser(); // 如果已經(jīng)登錄,并且是同一個(gè)人,并且不強制重新登錄,則直接跳轉到目標頁(yè) if(StringUtils.isNotBlank(user.getUserCode()) && StringUtils.equals(user.getLoginCode(), username) && !ObjectUtils.toBoolean(relogin)){ return REDIRECT + EncodeUtils.decodeUrl2(url); } // 通過(guò)令牌登錄系統 if (token != null){ try { FormToken upToken = new FormToken(); upToken.setUsername(username); // 登錄用戶(hù)名 upToken.setSsoToken(token); // 單點(diǎn)登錄令牌 upToken.setParams(ServletUtils.getExtParams(request)); // 登錄附加參數 UserUtils.getSubject().login(upToken); return REDIRECT + EncodeUtils.decodeUrl2(url); } catch (AuthenticationException e) { if (!e.getMessage().startsWith("msg:")){ throw new AuthenticationException("msg:登錄失敗,請聯(lián)系管理員。", e); } throw e; } } return "error/403";}一般用于第三方身份認證完成后,內部調用的登錄接口。
1、設置 application.yml(v4.0.x:jeesite.yml)的 shiro.sso.secretKey 快速登錄安全Key:
shiro: # 簡(jiǎn)單 SSO 登錄相關(guān)配置 sso: # 如果啟用/sso/{username}/{token}單點(diǎn)登錄,請修改此安全key并與單點(diǎn)登錄系統key一致。 secretKey: thinkgem # 是否加密單點(diǎn)登錄安全Key encryptKey: true2、調用登錄方法
try { String username = "admin"; FormToken upToken = new FormToken(); upToken.setUsername(username); upToken.setSsoToken(UserUtils.getSsoToken(username)); //upToken.setParams(ServletUtils.getExtParams(request)); UserUtils.getSubject().login(upToken); String sid = UserUtils.getSession().getId().toString(); System.out.println("登錄成功,__sid=" + sid);} catch (AuthenticationException e) { if (!e.getMessage().startsWith("msg:")){ throw new AuthenticationException("msg:登錄失敗,請聯(lián)系管理員。", e); } throw e; // 登錄失敗,拋出異常}http://127.0.0.1:8980/js/a/logout?__ajax=json&__sid=5fe9c7c45ded4425b03eff8f78179637注意:無(wú) cookie 環(huán)境下,必須要指定要退出的 sessionid
返回JSON數據:
{"result":"true","message":"退出成功!"}CAS 客戶(hù)端配置非常簡(jiǎn)單,開(kāi)啟如下配置,設置好服務(wù)于客戶(hù)端跳轉地址即可:
shiro: #索引頁(yè)路徑 defaultPath: ${shiro.loginUrl} # Apereo CAS 相關(guān)配置(個(gè)人版) casServerUrl: http://127.0.0.1:8981/cas casClientUrl: http://127.0.0.1:8980/js loginUrl: ${shiro.casServerUrl}?service=${shiro.casClientUrl}${adminPath}/login-cas logoutUrl: ${shiro.casServerUrl}/logout?service=${shiro.loginUrl} successUrl: ${shiro.casClientUrl}${adminPath}/index注意此功能是個(gè)人版功能,只有個(gè)人版以上版本才能使用。
集成史上最全的第三方登錄的開(kāi)源庫 JustAuth。目前已支持Github、Gitee、微博、釘釘、百度、Coding、騰訊云開(kāi)發(fā)者平臺、OSChina、支付寶、QQ、微信、淘寶、Google、Facebook、抖音、領(lǐng)英、小米、微軟、今日頭條、Teambition、StackOverflow、Pinterest、人人、華為、企業(yè)微信、酷家樂(lè )、Gitlab、美團、餓了么和推特等第三方平臺的授權登錄。
該模塊提供完善的通用接口擴展,若上述沒(méi)說(shuō)到的,也可以自己方便擴展。
1、打開(kāi) web 的 pom.xml,加入如下模塊依賴(lài)代碼
<!-- 第三方賬號登錄 --><dependency> <groupId>com.jeesite</groupId> <artifactId>jeesite-module-oauth2</artifactId> <version>${project.parent.version}</version></dependency>注意:此模塊源代碼,請向售后服務(wù)索取。
2、配置參數:
# 第三方系統認證oauth2: gitee: clientId: xxxxxx clientSecret: xxxxxx redirectUri: http://127.0.0.1:8980/js/oauth2/callback/gitee qq: clientId: xxxxxx clientSecret: xxxxxx redirectUri: http://127.0.0.1:8980/js/oauth2/callback/qq weixin: clientId: xxxxxx clientSecret: xxxxxx redirectUri: http://127.0.0.1:8980/js/oauth2/callback/weixin上述等等,不一一列舉,具體可以打開(kāi) Oauth2UserService 的 getAuthRequest 方法查看并擴展
地址格式:http://127.0.0.1:8980/js/oauth2/login/第三方唯一標識舉例如下:Gitee登錄:http://127.0.0.1:8980/js/oauth2/login/giteeQQ賬號登錄:http://127.0.0.1:8980/js/oauth2/login/qq微信賬號登錄:http://127.0.0.1:8980/js/oauth2/login/weixin地址格式:http://127.0.0.1:8980/js/oauth2/callback/第三方唯一標識舉例如下:Gitee登錄回調地址:http://127.0.0.1:8980/js/oauth2/callback/giteeQQ賬號登錄回調地址:http://127.0.0.1:8980/js/oauth2/callback/qq微信賬號登錄回調地址:http://127.0.0.1:8980/js/oauth2/callback/weixin聯(lián)系客服