JeeSite 已经默认集成了两种单点登录方式(Single Sign On):
1、SSO(简单登录)接口,实现快速登录系统。
2、与 Apereo CAS 服务器集成,快速实现系统登录(个人版)
并实现了第三方登录 OAuth2,如:微信、QQ、支付宝、等等
1、设置 application.yml
(v4.0.x:jeesite.yml
)的 shiro.sso.secretKey 快速登录安全Key,若不设置将无法使用该接口。
shiro: # 简单 SSO 登录相关配置 sso: # 如果启用/sso/{username}/{token}单点登录,请修改此安全key并与单点登录系统key一致。 secretKey: thinkgem # 是否加密单点登录安全Key encryptKey: true
2、举例调用地址如下,调用完成后自动登录系统:
http://localhost/project/sso/{username}/{token}?url=/sys/user/list?p1=v1%26p2=v2&relogin=true
token生成方式:
String username = "system"; // 登录系统名String secretKey = "thinkgem"; // yml 中设置的 shiro.sso.secretKey 参数值。String token = Md5Utils.md5(secretKey + username + DateUtils.getDate("yyyyMMdd"));// 如果 shiro.sso.encryptKey 为 true,则 secretKey 会自动加密。// 如果在本系统获取,则 secretKey 已经加密了,也可以通过下面这个简便方法获取。String token = UserUtils.getSsoToken(username);
该接口源码如下(提供参考):
/** * 单点登录(如已经登录,则直接跳转) * @param username 登录用户名(loginCode) * @param token 单点登录令牌,令牌组成:sso密钥+用户名+日期,进行md5加密,举例: * // 注意如果 shiro.sso.encryptKey 为 true,则 secretKey 会自动加密。 * 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(); // 如果已经登录,并且是同一个人,并且不强制重新登录,则直接跳转到目标页 if(StringUtils.isNotBlank(user.getUserCode()) && StringUtils.equals(user.getLoginCode(), username) && !ObjectUtils.toBoolean(relogin)){ return REDIRECT + EncodeUtils.decodeUrl2(url); } // 通过令牌登录系统 if (token != null){ try { FormToken upToken = new FormToken(); upToken.setUsername(username); // 登录用户名 upToken.setSsoToken(token); // 单点登录令牌 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:登录失败,请联系管理员。", e); } throw e; } } return "error/403";}
一般用于第三方身份认证完成后,内部调用的登录接口。
1、设置 application.yml
(v4.0.x:jeesite.yml
)的 shiro.sso.secretKey 快速登录安全Key:
shiro: # 简单 SSO 登录相关配置 sso: # 如果启用/sso/{username}/{token}单点登录,请修改此安全key并与单点登录系统key一致。 secretKey: thinkgem # 是否加密单点登录安全Key encryptKey: true
2、调用登录方法
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:登录失败,请联系管理员。", e); } throw e; // 登录失败,抛出异常}
http://127.0.0.1:8980/js/a/logout?__ajax=json&__sid=5fe9c7c45ded4425b03eff8f78179637
注意:无 cookie 环境下,必须要指定要退出的 sessionid
返回JSON数据:
{"result":"true","message":"退出成功!"}
CAS 客户端配置非常简单,开启如下配置,设置好服务于客户端跳转地址即可:
shiro: #索引页路径 defaultPath: ${shiro.loginUrl} # Apereo CAS 相关配置(个人版) 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
注意此功能是个人版功能,只有个人版以上版本才能使用。
集成史上最全的第三方登录的开源库 JustAuth。目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐、Gitlab、美团、饿了么和推特等第三方平台的授权登录。
该模块提供完善的通用接口扩展,若上述没说到的,也可以自己方便扩展。
1、打开 web 的 pom.xml,加入如下模块依赖代码
<!-- 第三方账号登录 --><dependency> <groupId>com.jeesite</groupId> <artifactId>jeesite-module-oauth2</artifactId> <version>${project.parent.version}</version></dependency>
注意:此模块源代码,请向售后服务索取。
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
上述等等,不一一列举,具体可以打开 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
联系客服