我正在使用Spring Boot + Spring Security OAuth2应用程序,我认为该应用程序的灵感来自Dave Syer的示例.应用程序配置为OAuth2授权服务器,单个公共客户端使用资源所有者密码凭据流.成功的令牌配置为JWT.
公共Angular客户端向/ oauth/token发送一个POST请求,其中包含一个包含客户端ID和密码的基本auth头(这是让客户端进行身份验证的最简单方法,即使秘密不是私有的).请求正文包含用户名,密码和授予类型"密码".
除了作为身份验证服务器之外,该应用程序还是用户,团队和组织的RESTful资源服务器.
我正在尝试使用Spring Social添加额外的SSO身份验证流程.我已经将Spring Social配置为通过/ auth/[provider]通过外部提供程序进行身份验证; 但是,以下请求不再正确设置SecurityContext.可能是Spring Security OAuth服务器或客户端覆盖了SecurityContext?
如果我可以在Spring Social流程之后正确设置SecurityContext,我有一个新的TokenGranter,允许新的授权类型"social",它将检查SecurityContextHolder以获得预先认证的用户.
我对SecurityContext的特定问题的解决方案感兴趣(我认为这是Spring OAuth +社交集成的问题),或者是与外部提供程序进行身份验证以及从我们自己的auth服务器获取有效JWT的不同方法.
谢谢!
spring-security single-sign-on spring-social spring-boot spring-security-oauth2
我在我的应用程序中使用Spring Social:
<spring.framework.version>3.2.0.RELEASE</spring.framework.version>
<hibernate.version>4.1.9.Final</hibernate.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<org.springframework.social-version>1.1.0.BUILD-SNAPSHOT</org.springframework.social-version>
<org.springframework.social.facebook-version>1.1.0.BUILD-SNAPSHOT</org.springframework.social.facebook-version>
<org.springframework-version>3.2.1.RELEASE</org.springframework-version>
<org.springframework.security.crypto-version>3.1.3.RELEASE</org.springframework.security.crypto-version>
Run Code Online (Sandbox Code Playgroud)
当我申请
private final Facebook facebook;
@Inject
public SearchController(Facebook facebook) {
this.facebook = facebook;
}
Run Code Online (Sandbox Code Playgroud)
到我的HomeController:
@Controller
public class HomeController {
private final Facebook facebook;
@Inject
public HomeController(Facebook facebook) {
this.facebook = facebook;
}
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Model model) {
return "home";
}
}
Run Code Online (Sandbox Code Playgroud)
注射工作就像有意,我可以从中获取信息facebook …
我无法在Spring Security Web App的任何地方找到类似于stackoverflow的Open Id注册的完整示例.
我会说我很聪明,但我发现Spring Security对其奇怪的Spring XML DSL非常恐惧.
我找到了一些如何使用以下方法进行良好的'stackoverflow注册:
但没有完整的例子(WAR).有没有人知道或有一个工作示例(即WAR)不仅仅是对内存中的openid URL进行身份验证?
更新:最新版本的Spring Social在管理Oauth注册方面做得非常出色.我们最终使用它了.虽然它不是OpenId,但我越来越喜欢Oauth而不是OpenId.对于那些有兴趣的人来说,有一个项目可以使用OpenId和spring social:https://github.com/molindo/spring-social-openid
在Spring MVC应用程序中,我有一个请求范围的bean.我在某处注入了这个bean.在那里,HTTP请求服务线程可能会产生一个新线程.
但每当我尝试从新生成的线程访问请求范围的bean时,我得到一个org.springframework.beans.factory.BeanCreationException
(参见下面的堆栈跟踪).
从HTTP请求线程访问请求范围的bean工作正常.
如何为HTTP请求线程生成的线程提供请求范围的bean?
获取以下代码段运行.然后启动服务器,例如http://example.com:8080.
访问http://example.com:8080/scopetestnormal时,每次向此地址发出请求时,counter
都会增加1(通过记录器输出会显着).:)超级!
访问http://example.com:8080/scopetestthread时,每次向此地址发出请求时,都会抛出上述异常.:(.无论什么选择ScopedProxyMode
,这种情况发生两个基于CGLIB 和
基于JDK动态代理接口请求范围豆
配置文件
package com.example.config
@Configuration
@ComponentScan(basePackages = { "com.example.scopetest" })
public class ScopeConfig {
private Integer counter = new Integer(0);
@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Number counter() {
counter = new Integer(counter.intValue() + 1);
return counter;
}
/* Adding a org.springframework.social.facebook.api.Facebook request-scoped bean as a real-world example why all this matters
@Bean
@Scope(value = "request", …
Run Code Online (Sandbox Code Playgroud) 我是新的泉.在Bean标签中,我找到了factory-method和factory-bean属性.factory-method和factory-bean有什么区别?
我使用factory-method来调用我的getInstance静态方法来创建singleton对象.
什么是工厂豆用于?
对于给定的回复,我理解的是
Factory-method用于调用静态方法以在同一个bean类中创建对象.
Factory-bean用于根据工厂设计模式创建对象.
例如: - 我通过传递我的蔬菜名称(在这种情况下为EggPlant)从VegetableFactory(将返回被要求的蔬菜对象)类中询问一个EggPlant对象.
如果我错了请纠正?
我已经实现了Spring社交+ Spring安全性,如Spring安全性示例(以及spring security java config)中所述.我当时报告了几个问题(请参阅https://jira.springsource.org/browse/SEC-2204)所有这些问题都已解决,我的安全性正常.
但是,我想更改我的安全实现并使用RESTful身份验证.Spring oauth/oauth2(http://projects.spring.io/spring-security-oauth/)解决了这个问题,但我看不出Spring Social如何适应这张图片?虽然幕后春天与Facebook/Twitter的社交谈话与oauth,我不认为Spring Social的注册形式和其他特征是为了一个宁静的api而建立的.
任何例子或想法肯定会有所帮助.谢谢.
这篇文章的最新消息:(4/6/2014)
似乎还有很长的路要走,但解决了在主系统上保留用户记录的问题.我很好奇是否有其他方法可以做到这一点?请指教.谢谢
在Spring Boot应用程序中,我有一个OAuth2授权/资源服务器.基于此和Spring Security,我已经获得了我的Spring MVC REST API端点.
除此之外,我还想基于第三方OAuth提供商(如Twitter,Facebook,Google)为我的REST端点添加身份验证.
在我的应用程序中,我有两个实体 - User
和SocialUser
.SocialUser
代表社交网络中的用户个人资料 User
可以有0-*关联SocialUsers
.现在我可以在Twitter上验证用户,之后我在我的数据库中创建两条记录 - User和SocialUser.SocialUser包含Twitter发布的访问/刷新令牌以及来自此社交网络的一些其他配置文件信息.
现在我不知道如何将从社交网络创建的用户与我现有的身份验证\授权流程相关联.对于这个用户,我想创建自己的(由我自己的OAuth2授权服务器)accessToken并将其提供给客户端.
此外,该用户在其实体中没有用户名,密码和电子邮件User
.而且我也不知道如何手动创建自己的访问令牌并将其发送到客户端以供将来的API调用.
我找到了一些例子:
@Inject
private TokenEndpoint tokenEndpoint;
public String createAccessToken(User user) {
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("client_id", "appid");
parameters.put("client_secret", "myOAuthSecret");
parameters.put("grant_type", "password");
parameters.put("password", user.getPassword());
parameters.put("scope", "read write");
parameters.put("username", user.getUsername());
// principal ??
return tokenEndpoint.getAccessToken(principal, parameters);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何Principal
基于我的User
实体创建,我也不确定这是一个正确的方法.
那么,主要的问题是 - 如何通过我自己的OAuth服务器为这个新用户手动生成这个新令牌?
请告诉我如何才能正确实施.谢谢.
更新:
我已添加ProviderSignInController
到我的应用程序中,现在能够通过Twitter执行完整的OAuth舞蹈.此外,我已经实现了自己的Neo4jConnectionRepository
,Neo4jUsersConnectionRepository
因为我使用Neo4j作为主数据库. …
spring-mvc spring-security oauth-2.0 spring-social spring-security-oauth2
我在Spring MVC项目中使用Spring Social Facebook来支持Facebook登录.这在几乎所有情况下都运行良好,但偶尔我会在日志中看到以下异常.
ERROR org.springframework.social.connect.web.ProviderSignInController - Exception while completing OAuth 2 connection:
java.lang.IllegalStateException: The OAuth2 'state' parameter doesn't match.
at org.springframework.social.connect.web.ConnectSupport.verifyStateParameter(ConnectSupport.java:173)
at org.springframework.social.connect.web.ConnectSupport.completeConnection(ConnectSupport.java:155)
at org.springframework.social.connect.web.ProviderSignInController.oauth2Callback(ProviderSignInController.java:216)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at …
Run Code Online (Sandbox Code Playgroud) 这是我现在拥有的:
我的问题是我希望这些API被多个客户端使用,但Facebook登录的方式现在,它在移动设备上运行不佳(在网站上运行良好).
这是移动方案:
可以这样做吗?或者我是否必须编写自己的API来持久保存用户连接?
感谢任何帮助!
rest spring-security ios spring-social spring-social-facebook
在Spring Boot应用程序中,我使用Spring Security和Spring OAuth2保护了我的Spring MVC REST端点.我有自己的Authorization\Resource服务器,所以为了与我们的API通信,客户端(AngularJS)需要从我的API授权服务器获取acessToken.
一切正常,但对于我的API的身份验证/授权,用户需要创建他的帐户并向我们提供他的用户名/密码.
我想简化此过程,并建议用户通过Google/Facebook/Twitter oAuth提供商对我的API进行身份验证.
现在我还不清楚它是如何运作的.例如我的一个想法 - Facebook将发布自己的accessToken并将其传递回我的API.基于此accessToken,我的API将发出自己的accessToken并将其传递回客户端应用程序(AngularJS).或者我应该直接将Facebook accessToken传递给客户端应用程序?
所述案例的正确架构是什么?它应该如何工作?
也许有一些例子可以演示基于Spring框架的这种架构?
spring spring-security oauth-2.0 spring-social spring-security-oauth2
spring-social ×10
spring ×5
spring-mvc ×3
java ×2
oauth-2.0 ×2
facebook ×1
hibernate ×1
inject ×1
ios ×1
openid ×1
registration ×1
rest ×1
spring-boot ×1
springsource ×1