diff --git a/boot-starter/boot-starter-security/boot-starter-security-browser/README.md b/boot-starter/boot-starter-security/boot-starter-security-browser/README.md index 282ba73..2b4a883 100644 --- a/boot-starter/boot-starter-security/boot-starter-security-browser/README.md +++ b/boot-starter/boot-starter-security/boot-starter-security-browser/README.md @@ -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 +样的组件。授权后直接跳转到域名首页 \ No newline at end of file diff --git a/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/config/BrowserSecurityConfig.java b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/config/BrowserSecurityConfig.java index a2b1961..3576c5d 100644 --- a/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/config/BrowserSecurityConfig.java +++ b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/config/BrowserSecurityConfig.java @@ -127,7 +127,10 @@ public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter { , DRUID , securityProperties.getBrowser().getHtml() //upms系统用户注册 - , "/upms/user") + , "/upms/user" + //用户注册或绑定的页面 + ,securityProperties.getBrowser().getSignUpUrl() + ,"用户的注册绑定url") .permitAll() //任何请求 .anyRequest() diff --git a/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/controller/BrowserSecurityController.java b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/controller/BrowserSecurityController.java index 84d56e3..404c815 100644 --- a/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/controller/BrowserSecurityController.java +++ b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/controller/BrowserSecurityController.java @@ -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; + } } diff --git a/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/pojo/SocialUserInfo.java b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/pojo/SocialUserInfo.java new file mode 100644 index 0000000..2e70b33 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-browser/src/main/java/com/micro/fast/security/browser/pojo/SocialUserInfo.java @@ -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; + } +} diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/config/param/BrowserProperties.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/config/param/BrowserProperties.java index 7ec16c2..fb08744 100644 --- a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/config/param/BrowserProperties.java +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/browser/config/param/BrowserProperties.java @@ -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; + } } diff --git a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java index 4530b4b..4b27fa3 100644 --- a/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java +++ b/boot-starter/boot-starter-security/boot-starter-security-core/src/main/java/com/micro/fast/security/core/social/SocialConfig.java @@ -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)); } } diff --git a/boot-starter/boot-starter-security/boot-starter-security-demo/src/main/java/com/micro/fast/security/demo/DemoConnectionSignUp.java b/boot-starter/boot-starter-security/boot-starter-security-demo/src/main/java/com/micro/fast/security/demo/DemoConnectionSignUp.java new file mode 100644 index 0000000..9fb7799 --- /dev/null +++ b/boot-starter/boot-starter-security/boot-starter-security-demo/src/main/java/com/micro/fast/security/demo/DemoConnectionSignUp.java @@ -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(); + } +}