我已经工作了几天,试图在REST API上实现oauth2保护.我已经尝试了很多不同的配置,但仍然没有设法让它工作.
我正在证明我现在的代码,但我与这个实现没有任何结合.如果你能告诉我一些完全不同的方式来实现我想要完成的目标,那就太好了.
我的流程如下:
Auth服务器运行正常.我在配置资源服务器时遇到问题.
这是我的一些配置.我有这个豆子:
@EnableOAuth2Client
@Configuration
@Import({PropertiesConfig.class}) //Imports properties from properties files.
public class OauthRestTemplateConfig {
@Bean
public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ClientContext oauth2ClientContext) {
OAuth2RestTemplate template = new OAuth2RestTemplate(oauth2ResourceDetails(), oauth2ClientContext);
return template;
}
@Bean
OAuth2ProtectedResourceDetails oauth2ResourceDetails() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("theOauth");
details.setClientId("clientID");
details.setClientSecret("SecretKey");
details.setAccessTokenUri("https://theAuthenticationServer.com/oauthserver/oauth2/token");
details.setUserAuthorizationUri("https://theAuthenticationServer.com/oauthserver/oauth2/token");
details.setTokenName("oauth_token");
details.setPreEstablishedRedirectUri("http://localhost/login");
details.setUseCurrentUri(true);
return details;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Resource Server的主安全配置中使用该bean:
@Slf4j
@Configuration
@EnableWebSecurity
@EnableOAuth2Client
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true, proxyTargetClass …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,目前使用Spring OAuth 2.0 In Memory Token Store.我需要将Spring Security OAuth 2.0 JAR转换为使用持久文件而不是内存来确保访问令牌在服务器重新启动时有效.Spring OAuth 2.0 JAR提供了使用JdbcTokenStore方法支持MYSQL数据库的例程,但是我无法找到任何文档来说明如何更改默认配置(使用InMemoryTokenStore方法)来使用支持的Jdbc方法.
我想听一下已经实现了Spring Security OAuth 2.0 JdbcTokenStore方法的人,并且可以提供执行此操作所需的配置示例,或者可以指向描述该过程的文档.我在互联网上搜索高低,但找不到任何此类文档.
我已经为Token Store找到了Spring Security OAuth 2.0模式文件,如果有人感兴趣,只能在Test Resource目录中找到它.任何Pivotal文档网站都没有记录它的存在.如果有必要,我可以阅读其余的Pivotal源代码,但我希望有人可以免除必须使用这条路径.
提前感谢您提供的任何帮助.
我正在关注Dave Syer的基本Spring Boot OAuth2示例:https://github.com/dsyer/sparklr-boot/blob/master/src/main/java/demo/Application.java
@Configuration
@ComponentScan
@EnableAutoConfiguration
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/")
public String home() {
return "Hello World";
}
@Configuration
@EnableResourceServer
protected static class ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
// Just for laughs, apply OAuth protection to only 2 resources
.requestMatchers().antMatchers("/","/admin/beans").and()
.authorizeRequests()
.anyRequest().access("#oauth2.hasScope('read')");
// @formatter:on
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("sparklr");
} …Run Code Online (Sandbox Code Playgroud) java spring spring-security spring-boot spring-security-oauth2
我正在尝试使用spring security oauth设置资源服务器以使用单独的授权服务器.我正在使用RemoteTokenServices哪个需要/check_token端点.
我可以看到/oauth/check_token端点在@EnableAuthorizationServer使用时默认启用.但是,默认情况下无法访问端点.
是否应手动添加以下条目以将此端点列入白名单?
http.authorizeRequests().antMatchers("/oauth/check_token").permitAll();
Run Code Online (Sandbox Code Playgroud)
这将使所有人都可以访问此端点,这是否是所需的行为?或者我错过了什么.
提前致谢,
我已经在我的spring-boot应用程序中实现了Oauth2.在我的security-context.xml中,我有这些行 -
<sec:intercept-url pattern="/trusted/**" access="isAnonymous()" />
<sec:intercept-url pattern="/**" access="isFullyAuthenticated()" />
Run Code Online (Sandbox Code Playgroud)
我希望在没有身份验证的情 但是,当我尝试访问/可信资源时,我仍然会提示我进行身份验证(这些是RESTful资源).
我错过了别的什么吗?
[编辑:]我正在使用'提供的'tomcat实例运行此应用程序.
java spring spring-security spring-boot spring-security-oauth2
我试图围绕OAuth2和Spring Security OAuth,特别是OAuth提供商服务.我正在尝试实现以下内容:
所有这些模块彼此独立,即在不同的项目中分开,并将托管在不同的域上,例如(1)http://oauth.web.com,(2)http://rest.web.com, (3)http://web.com
我的两个问题是:
A.如何实施Web客户端项目,以便在用户登录受保护页面或单击"登录"按钮时,重定向到OAuth提供者URL,登录,并在具有所有用户角色的Web客户端上进行身份验证,以及同时需要知道使用了哪个客户端.@EnableResourceServer(与实现资源服务器的方式相同;请参阅下面的代码)以获取用户的详细信息?我是否必须管理访问令牌并始终将其包含在对资源服务器的调用中,或者它可以以某种方式自动完成?
B.在我将要开发的移动应用程序上实现安全性的最佳方法是什么.我是否应该使用密码宏来进行此身份验证,因为应用程序将由我构建,我将在本机屏幕中将用户名和密码作为基本身份验证通过SSL发送到服务器?是否有任何示例我可以查看与Spring Security OAuth的对话并返回用户详细信息.
这是我对OAuth项目(1)和资源项目(2)的实现:
OAuth2服务器配置(大部分代码来自HERE)
@Configuration
@EnableAuthorizationServer
public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
DataSource dataSource;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore())
.approvalStore(approvalStore())
.authorizationCodeServices(authorizationCodeServices())
;
}
@Bean
public JdbcClientDetailsService clientDetailsService() {
return new JdbcClientDetailsService(dataSource);
}
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource);
}
@Bean …Run Code Online (Sandbox Code Playgroud) 首先,根据Spring doc ,如果我想将用户角色映射到范围,我应该使用setCheckUserScopes(true)到DefaultOAuth2RequestFactory.所以这样做的一种方法是注入我自己的DefaultOAuth2RequestFactory bean,正如doc所说:
The AuthorizationServerEndpointsConfigurer allows you to inject a custom OAuth2RequestFactory so you can use that feature to set up a factory if you use @EnableAuthorizationServer.
Run Code Online (Sandbox Code Playgroud)
然后我做
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends
AuthorizationServerConfigurerAdapter {
...
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints.authenticationManager(authenticationManager)
.tokenStore(tokenStore)
.tokenServices(tokenServices());
endpoints
.getOAuth2RequestFactory(); // this doesn't return me my own DefaultOAuth2RequestFactory
}
@Bean
@Primary
public OAuth2RequestFactory defaultOAuth2RequestFactory() {
DefaultOAuth2RequestFactory defaultOAuth2RequestFactory = new DefaultOAuth2RequestFactory(
clientDetailsService);
defaultOAuth2RequestFactory.setCheckUserScopes(true);
return defaultOAuth2RequestFactory;
}
}
Run Code Online (Sandbox Code Playgroud)
我忽略了AuthorizationServerEndpointsConfigurer中的方法requestFactory().这是将它传递给Spring …
java authentication spring user-permissions spring-security-oauth2
我有Spring OAuth授权服务器,我想添加对多个客户端(id)的支持.我为这样的客户配置了:
clients
.inMemory().withClient(client).secret(clientSecret)
.resourceIds(resourceId)
.authorizedGrantTypes("client_credentials", "password", "refresh_token", "implicit", "authorization_code")
.authorities("ROLE_USER")
.scopes("read", "write")
.autoApprove(true)
.and()
.inMemory().withClient("acme").secret("acmesecret")
.resourceIds(resourceId)
.authorizedGrantTypes("client_credentials", "password", "refresh_token", "implicit", "authorization_code")
.authorities("ROLE_USER_ACME")
.scopes("read", "write")
.autoApprove(true);
Run Code Online (Sandbox Code Playgroud)
我可以使用第一个客户端获取访问令牌,但在尝试使用第二个客户端获取访问令牌时出现此错误:
{
"timestamp": 1456822249638,
"status": 401,
"error": "Unauthorized",
"message": "Bad credentials",
"path": "/oauth/token"
}
Run Code Online (Sandbox Code Playgroud)
是否可以添加多个客户端以及如何执行此操作?另外,如何从数据库中读取客户端?
java spring spring-security oauth-2.0 spring-security-oauth2
我正在尝试将OAuth2添加到WebFlux,但找不到任何有用的示例.
要实现自己的授权服务器,我使用这样的代码:
@EnableAuthorizationServer
@Configuration
public class ServerAuth extends AuthorizationServerConfigurerAdapter {
...
}
Run Code Online (Sandbox Code Playgroud)
我的spring启动应用程序停止工作,因为在AuthorizationServerConfigurerAdapter类中,使用了AuthorizationServerSecurityConfigurer,它依赖于javax.servlet.Filter,但在WebFlux应用程序中,没有Servlet过滤器.
也AuthorizationServerEndpointsConfigurer期待与被初始化的UserDetailsService(旧的非反应性API)未反应UserDetailsRepository
如果可以,您可以在当前的WebFlux应用程序中使用oauth2吗?
谢谢
spring-security spring-boot spring-security-oauth2 spring-webflux
我在我的项目中使用spring security oauth.我通过在Spring安全性ResourceServerConfigurerAdapter中配置来从身份验证中排除一些URL.我补充道http.authorizeRequests().antMatchers(url).permitAll().
现在,我所看到的是,如果我没有将Authorization标头传递给这些网址,则不会对其进行身份验证.并且API被正确调用.
如果使用Authorization标头进行调用,则它会验证令牌并在未验证令牌时使调用失败.
我的问题是我需要做什么才能在我拥有permitAll的请求中忽略令牌.
authentication spring spring-security spring-security-oauth2