Spring security 集成Spring Security OAuth2和Spring Social

Spring security 集成Spring Security OAuth2和Spring Social,spring-security,spring-boot,single-sign-on,spring-social,spring-security-oauth2,Spring Security,Spring Boot,Single Sign On,Spring Social,Spring Security Oauth2,我正在使用SpringBoot+SpringSecurityOAuth2应用程序,我相信它的灵感来自DaveSyer的示例。应用程序被配置为OAuth2授权服务器,使用资源所有者密码凭据流的单个公共客户端。成功的令牌被配置为JWT 公共客户端向/oauth/token发送一个POST请求,其中包含一个包含客户端id和密码的基本身份验证头(这是让客户端进行身份验证的最简单方法,即使密码不是私有的)。请求主体包含用户名、密码和“密码”的授予类型 除了作为身份验证服务器之外,该应用程序还是用户、团队和

我正在使用SpringBoot+SpringSecurityOAuth2应用程序,我相信它的灵感来自DaveSyer的示例。应用程序被配置为OAuth2授权服务器,使用资源所有者密码凭据流的单个公共客户端。成功的令牌被配置为JWT

公共客户端向/oauth/token发送一个POST请求,其中包含一个包含客户端id和密码的基本身份验证头(这是让客户端进行身份验证的最简单方法,即使密码不是私有的)。请求主体包含用户名、密码和“密码”的授予类型

除了作为身份验证服务器之外,该应用程序还是用户、团队和组织的RESTful资源服务器

我正在尝试使用SpringSocial添加额外的SSO身份验证流。我已经将Spring Social配置为通过/auth/[provider]通过外部提供者进行身份验证;但是,以下请求不再正确设置SecurityContext。可能,Spring Security OAuth服务器或客户端正在重写SecurityContext

如果我能在Spring社交流之后正确设置SecurityContext,我就有了一个新的TokenGranter,它允许一个新的授予类型“Social”,用于检查SecurityContextHolder中预认证用户的身份

我对SecurityContext的具体问题的解决方案(我认为这是SpringOAuth+社会整合的问题)或与外部提供者进行身份验证并从我们自己的auth服务器获取有效JWT的不同方法感兴趣


谢谢

首先,我强烈建议您放弃这种用例的密码授权。
公共客户端(JavaScript、已安装的应用程序)无法对其客户端机密保密,这就是为什么不能为它们分配一个机密:任何检查JavaScript代码的访问者都可以发现该机密,从而实现与您相同的身份验证页,并在过程中存储用户密码

隐式授权完全是为您所做的事情而创建的。
使用基于重定向的流的优点是将身份验证机制留给授权服务器,而不是让每个应用程序都有一部分:这主要是单点登录(SSO)的定义

话虽如此,你的问题与我刚才回答的这个问题密切相关:

总结一下答案:

最后,是关于授权服务器如何保护AuthorizationEndpoint:/oauth/authorize。由于授权服务器正常工作,您已经有了一个扩展WebSecurity ConfigureAdapter的配置类,该类处理/oauth/authorize with formLogin的安全性。这就是你需要整合社交内容的地方


您不能简单地将密码授权用于您试图实现的目标,必须将您的公共客户端重定向到授权服务器。然后,授权服务器将重定向到社交登录,作为其
/oauth/authorize
端点的安全机制。

我在生成的web应用程序上遇到了类似的问题。最后,我决定使用SpringSocial的
SocialAuthenticationFilter
选项(通过
SpringSocialConfigure
)。成功的社交登录后,服务器自动生成并通过重定向到客户端应用程序返回“自己的”访问令牌

以下是我的尝试:

@配置
@EnableResourceServer
受保护的静态类ResourceServerConfiguration扩展ResourceServerConfigurerAdapter实现环境感知{
//...
@注入
私有授权服务器令牌服务authTokenServices;
@凌驾
public void configure(HttpSecurity http)引发异常{
SpringSocialConfigurer socialCfg=新的SpringSocialConfigurer();
社会的
.addObjectPostProcessor(新的ObjectPostProcessor(){
@抑制警告(“未选中”)
公共SocialAuthenticationFilter后处理(SocialAuthenticationFilter筛选器){
filter.setAuthenticationSuccessHandler(
新的SocialAuthenticationSuccessHandler(
授权服务,
您的应用程序客户端ID
)
);
回流过滤器;
}
});
http
//…许多其他配置。。。
.申请(社会福利基金);
}        
}
以及
SocialAuthenticationSuccessHandler
类:

公共类SocialAuthenticationSuccessHandler实现AuthenticationSuccessHandler{
公共静态最终字符串重定向_PATH_BASE=“/#/login”;
公共静态最终字符串字段\u TOKEN=“访问\u TOKEN”;
公共静态最终字符串字段\u expirement\u SECS=“expires\u in”;
私有最终记录器log=LoggerFactory.getLogger(getClass());
私有最终授权服务器TokenServices authTokenServices;
私有最终字符串localClientId;
public SocialAuthenticationSuccessHandler(AuthorizationServerTokenServices authTokenServices,字符串localClientId){
this.authTokenServices=authTokenServices;
this.localClientId=localClientId;
}
@凌驾
验证成功时公共无效(HttpServletRequest请求,
HttpServletResponse(响应、身份验证)
抛出IOException、ServletException{
log.debug(“通过身份验证的社交用户:“+authentication.getPrincipal()+”,生成并发送本地身份验证”);
OAuth2AccessToken oauth2Token=authTokenServices.createAccessToken(convertAuthentication(authentication));//自动检查有效性
字符串重定向URL=新的StringBuilder(重定向路径库)
.附加(“?”).a
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Example App</title>
    <meta http-equiv="Refresh" content="0; url=/index.html#/home"/>
</head>
<script>
     window.sessionStorage.setItem('access_token', '${token}');
</script>
<body>
<p>Please follow <a href="/index.html#/home">this link</a>.</p>
</body>
</html>