分享

SSO、单点登录、集成 CAS、OAuth2

 shinex 2020-05-09

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
  • username: 登录名,数据库中的 login_code 字段。
  • token: 登录令牌,根据yml里配置的登录安全Key生产的密码。
  • url: 登录之后要跳转的地址,如果url中携带参数,请使用转义字符,如“&”号,使用“%26”转义。

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":"退出成功!"}

集成 Apereo CAS

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

注意此功能是个人版功能,只有个人版以上版本才能使用。

OAuth2 第三方登录

集成史上最全的第三方登录的开源库 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

上述等等,不一一列举,具体可以打开 Oauth2UserServicegetAuthRequest 方法查看并扩展

系统登录地址:

地址格式:
http://127.0.0.1:8980/js/oauth2/login/第三方唯一标识

举例如下:
Gitee登录:http://127.0.0.1:8980/js/oauth2/login/gitee
QQ账号登录: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/gitee
QQ账号登录回调地址:http://127.0.0.1:8980/js/oauth2/callback/qq
微信账号登录回调地址:http://127.0.0.1:8980/js/oauth2/callback/weixin

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多