Spring 安全性不适用于授权:来自 OAuth2 的不记名令牌
Spring Security is not working with Authorization: Bearer token from OAuth2
我有两个微服务,第一个用于 OAuth2,第二个用于 API。当我从浏览器登录时,一切正常,授权通过并重定向到我的 API 工作。但是当我尝试通过 Postman 执行此操作时,我无法访问 API.
请看这个link,我从这个https://www.baeldung.com/sso-spring-security-oauth2
中复制了很多代码
技术堆栈:Java8,Spring引导,Spring网络,Spring安全,OAuth2。
我尝试使用不同的配置和许多选项,但到目前为止我已将代码返回到传出状态,以便您可以告诉我可能是什么错误。
授权模块:
server:
port: 8081
servlet:
context-path: /auth
@SpringBootApplication
@EnableResourceServer
public class AuthApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AuthApplication.class, args);
}
}
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("my-client")
.secret(passwordEncoder.encode("secret"))
.authorizedGrantTypes("authorization_code", "client_credentials")
.scopes("user_info", "read", "write", "trust")
.autoApprove(true)
.accessTokenValiditySeconds(5000)
.redirectUris("http://localhost:8080/api/login");
}
}
@Configuration
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers()
.antMatchers("/login", "/oauth/authorize")
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("john")
.password(passwordEncoder().encode("john"))
.roles("USER");
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
API 模块:
server:
servlet:
context-path: /api
security:
oauth2:
client:
clientId: my-client
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/user/me
@Configuration
@EnableOAuth2Sso
@EnableWebSecurity
public class OAuthConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.authorizeRequests()
.antMatchers("/login**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.logout().permitAll()
.and()
.httpBasic().disable();
}
}
@RestController
public class DashboardController {
@GetMapping("/demo")
public String demo() {
return "Hello";
}
}
当我获得 access_token 时 - 我无法访问 API。
请看下面的截图
一般来说,我会专注于编写您的 API 并使用第三方授权服务器。没有人应该为自己的授权服务器编写代码 - 一些在线 Java 指南具有很强的误导性。消费者将如何获得令牌并调用您的 API?以下示例消息工作流可能会帮助您思考:https://authguidance.com/2017/09/26/basicspa-oauthworkflow/
如果有帮助,请随时向我发送后续问题
此问题的根本原因是 OAuth2 应用程序上的 @EnableResourceServer 注释。为什么?因为实际上OAuth2 server是不能同时做Resource服务和Authentication服务的。所以我们需要简化OAuth2资源端的逻辑,去掉下面的注解。我要关闭这个问题。
如果有人有问题 - 请发表评论
我有两个微服务,第一个用于 OAuth2,第二个用于 API。当我从浏览器登录时,一切正常,授权通过并重定向到我的 API 工作。但是当我尝试通过 Postman 执行此操作时,我无法访问 API.
请看这个link,我从这个https://www.baeldung.com/sso-spring-security-oauth2
中复制了很多代码技术堆栈:Java8,Spring引导,Spring网络,Spring安全,OAuth2。
我尝试使用不同的配置和许多选项,但到目前为止我已将代码返回到传出状态,以便您可以告诉我可能是什么错误。
授权模块:
server:
port: 8081
servlet:
context-path: /auth
@SpringBootApplication
@EnableResourceServer
public class AuthApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AuthApplication.class, args);
}
}
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("my-client")
.secret(passwordEncoder.encode("secret"))
.authorizedGrantTypes("authorization_code", "client_credentials")
.scopes("user_info", "read", "write", "trust")
.autoApprove(true)
.accessTokenValiditySeconds(5000)
.redirectUris("http://localhost:8080/api/login");
}
}
@Configuration
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers()
.antMatchers("/login", "/oauth/authorize")
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin().permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("john")
.password(passwordEncoder().encode("john"))
.roles("USER");
}
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
API 模块:
server:
servlet:
context-path: /api
security:
oauth2:
client:
clientId: my-client
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/user/me
@Configuration
@EnableOAuth2Sso
@EnableWebSecurity
public class OAuthConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.authorizeRequests()
.antMatchers("/login**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.logout().permitAll()
.and()
.httpBasic().disable();
}
}
@RestController
public class DashboardController {
@GetMapping("/demo")
public String demo() {
return "Hello";
}
}
当我获得 access_token 时 - 我无法访问 API。
请看下面的截图
一般来说,我会专注于编写您的 API 并使用第三方授权服务器。没有人应该为自己的授权服务器编写代码 - 一些在线 Java 指南具有很强的误导性。消费者将如何获得令牌并调用您的 API?以下示例消息工作流可能会帮助您思考:https://authguidance.com/2017/09/26/basicspa-oauthworkflow/ 如果有帮助,请随时向我发送后续问题
此问题的根本原因是 OAuth2 应用程序上的 @EnableResourceServer 注释。为什么?因为实际上OAuth2 server是不能同时做Resource服务和Authentication服务的。所以我们需要简化OAuth2资源端的逻辑,去掉下面的注解。我要关闭这个问题。
如果有人有问题 - 请发表评论