对第三方登录中的注册逻辑进行处理

This commit is contained in:
winLsy
2018-01-16 22:17:04 +08:00
parent 6b44d9551e
commit d0a49efd4a
7 changed files with 147 additions and 3 deletions
@@ -2,9 +2,14 @@
##相关配置参数说明
- `ms.security.browser.html` 自定义登录页面的地址(不一定必须参数)
- `ms.security.browser.signUpUrl` 第三方登录时用户不存在的时候跳转的注册页面或绑定页面 (必要参数)
- `ms.security.browser.loginType` 身份认证后响应类型`REDIRECT`页面形式响应,`JSON`, json形式的响应
- `ms.security.browser.rememberMeSeconds` 记住我的时间,单位是秒,默认的时间是3600秒,`remember-me`参数,值为`true`
- `/authentication/require`处理身份认证跳转的接口地址
- 需要注入`userServiceImpl`获取用户详细信息的bean (必须参数)
- 需要注入数据源`masterDataSource`用于记住我功能的bean,记住我功能需要在登录的时候传入(必须参数)
- 使用这个模块的时候需要借助providerSignInUtils.doPostSignUp();方法实现一个接口将用户的注册或绑定信息插入到数据表中。并将url
配置可以直接访问
- 第三方登陆时,当用户不存在的时候,如果想要系统自动注册一个用户,不进行跳转的话。声明一个类似于demo项目中DemoConnectionSignUp
样的组件。授权后直接跳转到域名首页
@@ -127,7 +127,10 @@ public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
, DRUID
, securityProperties.getBrowser().getHtml()
//upms系统用户注册
, "/upms/user")
, "/upms/user"
//用户注册或绑定的页面
,securityProperties.getBrowser().getSignUpUrl()
,"用户的注册绑定url")
.permitAll()
//任何请求
.anyRequest()
@@ -1,20 +1,26 @@
package com.micro.fast.security.browser.controller;
import com.micro.fast.security.browser.pojo.SocialUserInfo;
import com.micro.fast.security.core.master.SecurityConstants;
import com.micro.fast.security.core.master.SecurityProperties;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.web.ProviderSignInUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -29,6 +35,9 @@ public class BrowserSecurityController {
@Autowired
private SecurityProperties securityProperties;
@Autowired
private ProviderSignInUtils providerSignInUtils;
private static final Logger log = LoggerFactory.getLogger(BrowserSecurityController.class);
private static final String REQUEST_URL_SUFFIX = ".html";
@@ -60,5 +69,23 @@ public class BrowserSecurityController {
//如果是异步请求的话就放回404状态码和提示信息
return "未进行身份认证";
}
/**
* 使用providerSignInUtils工具类从session中获取用户第三方登录的信息,这些信息是在第三方
* 登录跳转到注册页面之前的时候放入到session中的
* @param request
* @return
*/
@GetMapping("/social/user")
public SocialUserInfo getSocialUserInfo(HttpServletRequest request){
SocialUserInfo socialUserInfo = new SocialUserInfo();
Connection<?> connectionFromSession = providerSignInUtils.getConnectionFromSession(new ServletWebRequest(request));
socialUserInfo.setProviderId(connectionFromSession.getKey().getProviderId());
socialUserInfo.setProviderUserId(connectionFromSession.getKey().getProviderUserId());
socialUserInfo.setHeadingUrl(connectionFromSession.getDisplayName());
socialUserInfo.setHeadingUrl(connectionFromSession.getImageUrl());
return socialUserInfo;
}
}
@@ -0,0 +1,56 @@
package com.micro.fast.security.browser.pojo;
/**
* 第三方登录时用户的信息
* @author lsy
*/
public class SocialUserInfo {
/**
* 第三方登录的服务商标识
*/
private String providerId;
/**
* 用户的第三方id
*/
private String providerUserId;
/**
* 昵称
*/
private String nickname;
/**
* 用户头像的url
*/
private String headingUrl;
public String getProviderId() {
return providerId;
}
public void setProviderId(String providerId) {
this.providerId = providerId;
}
public String getProviderUserId() {
return providerUserId;
}
public void setProviderUserId(String providerUserId) {
this.providerUserId = providerUserId;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getHeadingUrl() {
return headingUrl;
}
public void setHeadingUrl(String headingUrl) {
this.headingUrl = headingUrl;
}
}
@@ -8,7 +8,10 @@ import com.micro.fast.security.core.browser.constant.LoginType;
* @author lsy
*/
public class BrowserProperties {
/**
* 第三方登录时用户不存在的时候跳转的注册页面
*/
private String signUpUrl = "/ms-signUp.html";
/**
* 用户自自定义的登录页面,不能为空
*/
@@ -47,4 +50,12 @@ public class BrowserProperties {
public void setLoginType(LoginType loginType) {
this.loginType = loginType;
}
public String getSignUpUrl() {
return signUpUrl;
}
public void setSignUpUrl(String signUpUrl) {
this.signUpUrl = signUpUrl;
}
}
@@ -9,8 +9,10 @@ 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.ConnectionSignUp;
import org.springframework.social.connect.UsersConnectionRepository;
import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;
import org.springframework.social.connect.web.ProviderSignInUtils;
import org.springframework.social.security.SpringSocialConfigurer;
import javax.sql.DataSource;
@@ -32,6 +34,11 @@ public class SocialConfig extends SocialConfigurerAdapter{
@Autowired
private SecurityProperties securityProperties;
@Autowired
private ConnectionFactoryLocator connectionFactoryLocator;
@Autowired
private ConnectionSignUp connectionSignUp;
/**
*
* @param connectionFactoryLocator
@@ -43,11 +50,32 @@ public class SocialConfig extends SocialConfigurerAdapter{
JdbcUsersConnectionRepository jdbcUsersConnectionRepository = new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
//使用OAuth2.sql创建如果数据表自定义前缀的话在这里声明
jdbcUsersConnectionRepository.setTablePrefix("upms_");
//如果用户定义了connectionSignUp注册用户的逻辑就放入数据库操作类中默认创建用户
if (connectionSignUp !=null){
jdbcUsersConnectionRepository.setConnectionSignUp(connectionSignUp);
}
return jdbcUsersConnectionRepository;
}
/**
* springSocial的配置的bean
* @return
*/
@Bean
public SpringSocialConfigurer springSocialConfigurer(){
SocialProperties social = securityProperties.getSocial();
return new MsSpringSocialConfigurer(social.getFilterProcessUrl());
MsSpringSocialConfigurer msSpringSocialConfigurer = new MsSpringSocialConfigurer(social.getFilterProcessUrl());
// 设置第三方登录用户不存在的时候,注册或绑定的页面。如果设置为空则不跳转
msSpringSocialConfigurer.signupUrl(securityProperties.getBrowser().getSignUpUrl());
return msSpringSocialConfigurer;
}
/**
* 在第三方登录跳转到的注册页面显示第三方的用户信息
* @return
*/
@Bean
public ProviderSignInUtils providerSignInUtils(){
return new ProviderSignInUtils(connectionFactoryLocator,getUsersConnectionRepository(connectionFactoryLocator));
}
}
@@ -0,0 +1,14 @@
package com.micro.fast.security.demo;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionSignUp;
import org.springframework.stereotype.Component;
@Component
public class DemoConnectionSignUp implements ConnectionSignUp {
@Override
public String execute(Connection<?> connection) {
//根据社交用户信息,默认创建用户,并返回用户的唯一标识
return connection.getDisplayName();
}
}