
top.dcenter.ums.security.social.callback.SocialOAuth2AuthenticationService Maven / Gradle / Ivy
package top.dcenter.ums.security.social.callback;
import org.springframework.social.connect.support.OAuth2ConnectionFactory;
import org.springframework.social.security.provider.OAuth2AuthenticationService;
import org.springframework.util.StringUtils;
import top.dcenter.ums.security.social.api.callback.BaseOAuth2ConnectionFactory;
import javax.servlet.http.HttpServletRequest;
import java.util.Set;
import static top.dcenter.ums.security.core.consts.SecurityConstants.KEY_VALUE_SEPARATOR;
import static top.dcenter.ums.security.core.consts.SecurityConstants.URL_PARAMETER_IDENTIFIER;
import static top.dcenter.ums.security.core.consts.SecurityConstants.URL_PARAMETER_SEPARATOR;
import static top.dcenter.ums.security.core.consts.SecurityConstants.URL_SEPARATOR;
/**
* 对 {@link OAuth2AuthenticationService} 的扩展.
* 通过覆写 buildReturnToUrl(request)方法, 使 social 支持通过统一的回调地址路由到多个回调地址。
* @author zyw
* @version V1.0 Created by 2020/5/21 15:54
*/
@SuppressWarnings("AlibabaClassNamingShouldBeCamel")
public class SocialOAuth2AuthenticationService extends OAuth2AuthenticationService {
public SocialOAuth2AuthenticationService(OAuth2ConnectionFactory connectionFactory) {
super(connectionFactory);
}
/**
* 使 social 支持通过统一的回调地址路由到多个回调地址。
* 如要自定义此逻辑,实现 {@link BaseOAuth2ConnectionFactory#buildReturnToUrl(HttpServletRequest, Set)} 即可。
* @param request request
* @return 返回统一的回调地址
*/
@Override
protected String buildReturnToUrl(HttpServletRequest request) {
OAuth2ConnectionFactory connectionFactory = getConnectionFactory();
Set returnToUrlParameters = getReturnToUrlParameters();
if (connectionFactory instanceof BaseOAuth2ConnectionFactory)
{
// 获取自定义逻辑的回调地址
//noinspection rawtypes
String returnToUrl = ((BaseOAuth2ConnectionFactory) connectionFactory).buildReturnToUrl(request, returnToUrlParameters);
if (!StringUtils.isEmpty(returnToUrl))
{
// 返回用户自定义实现
return returnToUrl;
}
}
// 如果自定义实现返回null,则使用默认实现
StringBuffer sb = request.getRequestURL();
// 去掉 providerId,改成统一的回调地址
sb.setLength(sb.lastIndexOf(URL_SEPARATOR));
// url 添加参数
sb.append(URL_PARAMETER_IDENTIFIER);
for (String name : returnToUrlParameters) {
// Assume for simplicity that there is only one value
String value = request.getParameter(name);
if (value == null) {
continue;
}
sb.append(name).append(KEY_VALUE_SEPARATOR).append(value).append(URL_PARAMETER_SEPARATOR);
}
// strip trailing ? or &
sb.setLength(sb.length() - 1);
return sb.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy