对第三方登录中的注册逻辑进行处理
This commit is contained in:
@@ -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
|
||||
样的组件。授权后直接跳转到域名首页
|
||||
|
||||
+4
-1
@@ -127,7 +127,10 @@ public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
, DRUID
|
||||
, securityProperties.getBrowser().getHtml()
|
||||
//upms系统用户注册
|
||||
, "/upms/user")
|
||||
, "/upms/user"
|
||||
//用户注册或绑定的页面
|
||||
,securityProperties.getBrowser().getSignUpUrl()
|
||||
,"用户的注册绑定url")
|
||||
.permitAll()
|
||||
//任何请求
|
||||
.anyRequest()
|
||||
|
||||
+27
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+56
@@ -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;
|
||||
}
|
||||
}
|
||||
+12
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+29
-1
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
+14
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user