同步
This commit is contained in:
+1
@@ -0,0 +1 @@
|
||||
package com.micro.fast.security.core.authentication.mobile;
|
||||
+1
@@ -0,0 +1 @@
|
||||
package com.micro.fast.security.core.browser;
|
||||
+1
@@ -0,0 +1 @@
|
||||
package com.micro.fast.security.core.master;
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package com.micro.fast.security.core.social;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.crypto.encrypt.Encryptors;
|
||||
import org.springframework.social.config.annotation.EnableSocial;
|
||||
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
|
||||
import org.springframework.social.connect.ConnectionFactoryLocator;
|
||||
import org.springframework.social.connect.UsersConnectionRepository;
|
||||
import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
@Configuration
|
||||
@EnableSocial
|
||||
public class SocialConfig extends SocialConfigurerAdapter{
|
||||
|
||||
@Autowired
|
||||
@Qualifier("dynamicDataSource")
|
||||
private DataSource dataSource;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param connectionFactoryLocator
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
|
||||
//第三参数是加解密的策略,这里指定是不做加解密操作
|
||||
return new JdbcUsersConnectionRepository(dataSource,connectionFactoryLocator, Encryptors.noOpText());
|
||||
}
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
package com.micro.fast.security.core.social;
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package com.micro.fast.security.core.social.qq.api;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author lsy
|
||||
*/
|
||||
public interface QQ {
|
||||
/**
|
||||
* 获取qq用户的信息
|
||||
* @return
|
||||
*/
|
||||
QQUserInfo getQQUserInfo() ;
|
||||
}
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
package com.micro.fast.security.core.social.qq.api;
|
||||
|
||||
/**
|
||||
* @author lsy
|
||||
*/
|
||||
public class QQUserInfo {
|
||||
|
||||
/**
|
||||
* ret : 0
|
||||
* msg :
|
||||
* nickname : Peter
|
||||
* figureurl : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/30
|
||||
* figureurl_1 : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/50
|
||||
* figureurl_2 : http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/100
|
||||
* figureurl_qq_1 : http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/40
|
||||
* figureurl_qq_2 : http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/100
|
||||
* gender : 男
|
||||
* is_yellow_vip : 1
|
||||
* vip : 1
|
||||
* yellow_vip_level : 7
|
||||
* level : 7
|
||||
* is_yellow_year_vip : 1
|
||||
*/
|
||||
|
||||
private int ret;
|
||||
private String openId;
|
||||
private String msg;
|
||||
private String nickname;
|
||||
private String figureurl;
|
||||
private String figureurl_1;
|
||||
private String figureurl_2;
|
||||
private String figureurl_qq_1;
|
||||
private String figureurl_qq_2;
|
||||
private String gender;
|
||||
private String is_yellow_vip;
|
||||
private String vip;
|
||||
private String yellow_vip_level;
|
||||
private String level;
|
||||
private String is_yellow_year_vip;
|
||||
|
||||
public int getRet() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void setRet(int ret) {
|
||||
this.ret = ret;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public void setMsg(String msg) {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public String getNickname() {
|
||||
return nickname;
|
||||
}
|
||||
|
||||
public void setNickname(String nickname) {
|
||||
this.nickname = nickname;
|
||||
}
|
||||
|
||||
public String getFigureurl() {
|
||||
return figureurl;
|
||||
}
|
||||
|
||||
public void setFigureurl(String figureurl) {
|
||||
this.figureurl = figureurl;
|
||||
}
|
||||
|
||||
public String getFigureurl_1() {
|
||||
return figureurl_1;
|
||||
}
|
||||
|
||||
public void setFigureurl_1(String figureurl_1) {
|
||||
this.figureurl_1 = figureurl_1;
|
||||
}
|
||||
|
||||
public String getFigureurl_2() {
|
||||
return figureurl_2;
|
||||
}
|
||||
|
||||
public void setFigureurl_2(String figureurl_2) {
|
||||
this.figureurl_2 = figureurl_2;
|
||||
}
|
||||
|
||||
public String getFigureurl_qq_1() {
|
||||
return figureurl_qq_1;
|
||||
}
|
||||
|
||||
public void setFigureurl_qq_1(String figureurl_qq_1) {
|
||||
this.figureurl_qq_1 = figureurl_qq_1;
|
||||
}
|
||||
|
||||
public String getFigureurl_qq_2() {
|
||||
return figureurl_qq_2;
|
||||
}
|
||||
|
||||
public void setFigureurl_qq_2(String figureurl_qq_2) {
|
||||
this.figureurl_qq_2 = figureurl_qq_2;
|
||||
}
|
||||
|
||||
public String getGender() {
|
||||
return gender;
|
||||
}
|
||||
|
||||
public void setGender(String gender) {
|
||||
this.gender = gender;
|
||||
}
|
||||
|
||||
public String getIs_yellow_vip() {
|
||||
return is_yellow_vip;
|
||||
}
|
||||
|
||||
public void setIs_yellow_vip(String is_yellow_vip) {
|
||||
this.is_yellow_vip = is_yellow_vip;
|
||||
}
|
||||
|
||||
public String getVip() {
|
||||
return vip;
|
||||
}
|
||||
|
||||
public void setVip(String vip) {
|
||||
this.vip = vip;
|
||||
}
|
||||
|
||||
public String getYellow_vip_level() {
|
||||
return yellow_vip_level;
|
||||
}
|
||||
|
||||
public void setYellow_vip_level(String yellow_vip_level) {
|
||||
this.yellow_vip_level = yellow_vip_level;
|
||||
}
|
||||
|
||||
public String getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
public void setLevel(String level) {
|
||||
this.level = level;
|
||||
}
|
||||
|
||||
public String getIs_yellow_year_vip() {
|
||||
return is_yellow_year_vip;
|
||||
}
|
||||
|
||||
public String getOpenId() {
|
||||
return openId;
|
||||
}
|
||||
|
||||
public void setOpenId(String openId) {
|
||||
this.openId = openId;
|
||||
}
|
||||
|
||||
public void setIs_yellow_year_vip(String is_yellow_year_vip) {
|
||||
this.is_yellow_year_vip = is_yellow_year_vip;
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
package com.micro.fast.security.core.social.qq.api.impl;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.micro.fast.security.core.social.qq.api.QQUserInfo;
|
||||
import com.micro.fast.security.core.social.qq.api.QQ;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.social.oauth2.AbstractOAuth2ApiBinding;
|
||||
import org.springframework.social.oauth2.TokenStrategy;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* 获取qq用户信息的实现类
|
||||
* @author lsy
|
||||
*/
|
||||
public class QQImpl extends AbstractOAuth2ApiBinding implements QQ {
|
||||
|
||||
/**
|
||||
* 获取用户openId的字符串
|
||||
*/
|
||||
public static final String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s";
|
||||
|
||||
/**
|
||||
* 获取qq用户信息的字符串
|
||||
*/
|
||||
public static final String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s";
|
||||
|
||||
/**
|
||||
* 系统在qq互联注册的id
|
||||
*/
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* qq用户的id
|
||||
*/
|
||||
private String openId;
|
||||
|
||||
private ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
public QQImpl(String accessToken,String appId){
|
||||
//将accessToken放在请求的url中
|
||||
super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);
|
||||
this.appId = appId;
|
||||
//使用accessToken获取用户的openId
|
||||
String url = String.format(URL_GET_OPENID,accessToken);
|
||||
String result = getRestTemplate().getForObject(url, String.class);
|
||||
System.out.println(result);
|
||||
this.openId = StringUtils.substringBetween(result,"\"openid\":","}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public QQUserInfo getQQUserInfo() {
|
||||
//获取qq用户的信息对象
|
||||
String url = String.format(URL_GET_USERINFO, appId, openId);
|
||||
String result = getRestTemplate().getForObject(url, String.class);
|
||||
QQUserInfo qqUserInfo = null;
|
||||
try {
|
||||
qqUserInfo = objectMapper.readValue(result, QQUserInfo.class);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("获取用户信息失败");
|
||||
}
|
||||
return qqUserInfo;
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
package com.micro.fast.security.core.social.qq.connet;
|
||||
|
||||
import com.micro.fast.security.core.social.qq.api.QQ;
|
||||
import com.micro.fast.security.core.social.qq.api.QQUserInfo;
|
||||
import org.springframework.social.connect.ApiAdapter;
|
||||
import org.springframework.social.connect.ConnectionValues;
|
||||
import org.springframework.social.connect.UserProfile;
|
||||
|
||||
/**
|
||||
* @author lsy
|
||||
*/
|
||||
public class QQAdapter implements ApiAdapter<QQ> {
|
||||
|
||||
/**
|
||||
* 测试当前的qqApi是否可用
|
||||
* @param qq
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean test(QQ qq) {
|
||||
//默认qq第三方登录永久可用
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置用户的连接信息
|
||||
* @param qq
|
||||
* @param connectionValues
|
||||
*/
|
||||
@Override
|
||||
public void setConnectionValues(QQ qq, ConnectionValues connectionValues) {
|
||||
QQUserInfo qqUserInfo = qq.getQQUserInfo();
|
||||
//设置用户的昵称
|
||||
connectionValues.setDisplayName(qqUserInfo.getNickname());
|
||||
//qq用户40*40的头像
|
||||
connectionValues.setImageUrl(qqUserInfo.getFigureurl_qq_1());
|
||||
//设置用户的主页
|
||||
connectionValues.setProfileUrl(null);
|
||||
//服务商提供的用户的id
|
||||
connectionValues.setProviderUserId(qqUserInfo.getOpenId());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param qq
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public UserProfile fetchUserProfile(QQ qq) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* qq没有此功能
|
||||
* @param qq
|
||||
* @param s
|
||||
*/
|
||||
@Override
|
||||
public void updateStatus(QQ qq, String s) {
|
||||
//do nothing
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.micro.fast.security.core.social.qq.connet;
|
||||
|
||||
import com.micro.fast.security.core.social.qq.api.QQ;
|
||||
import org.springframework.social.connect.support.OAuth2ConnectionFactory;
|
||||
|
||||
public class QQConnectionFactory extends OAuth2ConnectionFactory<QQ> {
|
||||
/**
|
||||
* 使用连接工厂创建连接
|
||||
* @param providerId
|
||||
* @param appId
|
||||
* @param appSecret
|
||||
*/
|
||||
public QQConnectionFactory(String providerId
|
||||
,String appId,String appSecret) {
|
||||
super(providerId,new QQServiceProvider(appId,appSecret),new QQAdapter());
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package com.micro.fast.security.core.social.qq.connet;
|
||||
|
||||
import com.micro.fast.security.core.social.qq.api.QQ;
|
||||
import com.micro.fast.security.core.social.qq.api.impl.QQImpl;
|
||||
import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;
|
||||
import org.springframework.social.oauth2.OAuth2Template;
|
||||
|
||||
/**
|
||||
* 获取QQ用户信息服务的提供方
|
||||
* @author lsy
|
||||
*/
|
||||
public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {
|
||||
|
||||
/**
|
||||
* qq分配给应用的id
|
||||
*/
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* 认证服务器地址
|
||||
*/
|
||||
public static final String URL_AUTHORIZE = "https://graph.qq.com/oauth2.0/authorize";
|
||||
|
||||
/**
|
||||
* accessToken的获取地址
|
||||
*/
|
||||
public static final String URL_ACCESS_TOKEN = "https://graph.qq.com/oauth2.0/token";
|
||||
|
||||
/**
|
||||
* qq互联会给每一个应用分配一个appId和一个appSecret,相当于appd的id和密码
|
||||
* @param appId 应用的id
|
||||
* @param appSecret 应用的密码
|
||||
*/
|
||||
public QQServiceProvider(String appId,String appSecret) {
|
||||
super(new OAuth2Template(appId,appSecret,URL_AUTHORIZE,URL_ACCESS_TOKEN));
|
||||
this.appId = appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回获取用户信息的对象
|
||||
* @param accessToken 会由抽象类传入
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public QQ getApi(String accessToken) {
|
||||
return new QQImpl(accessToken ,this.appId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user