只是为了澄清几点,并在Pratik Shah(以及Alex在相关线程中)提供的答案中添加更多信息:
1-configure
通过创建扩展的类来覆盖提到的方法AuthorizationServerConfigurerAdapter
:
@EnableAuthorizationServer
@Configuration
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("ger-client-id")
.secret("ger-secret")
.authorizedGrantTypes("password")
.scopes("read", "write");
}
}
2-我建议阅读这个 Spring 指南@EnableAuthorizationServer
,解释当我们包含注解时 Spring Boot 执行的自动配置,包括一个AuthorizationServerConfigurer
bean。如果您AuthorizationServerConfigurerAdapter
像我在上面所做的那样创建一个扩展 bean 的配置 bean,那么整个自动配置将被禁用。
3- 如果自动配置非常适合您,并且您只想操作对/oauth/check_token
端点的访问,您仍然可以在不创建AuthorizationServerConfigurer
bean 的情况下这样做(因此不必以编程方式配置所有内容)。
您必须将security.oauth2.authorization.check-token-access
属性添加到application.properties
文件中,例如:
security.oauth2.client.client-id=ger-client-id
security.oauth2.client.client-secret=ger-secret
security.oauth2.client.scope=read,write
security.oauth2.authorization.check-token-access=permitAll()
当然,isAuthenticated()
如果你愿意,你可以给它一个值。
您可以将日志级别设置为 DEBUG 以检查是否按预期配置了所有内容:
16:16:42.763 [main] DEBUG o.s.s.w.a.e.ExpressionBasedFilterInvocationSecurityMetadataSource - Adding web access control expression 'permitAll()', for Ant [pattern='/oauth/check_token']
没有太多关于这些属性的文档,但是您可以从这个自动配置类中找出它们。
最后值得一提的是,尽管它似乎在最新的 Spring 版本中已修复,但我刚刚在spring-security-oauth项目中提交了一个问题;如果您在请求中添加斜杠,则默认情况下会启用 token_check 功能:
$ curl localhost:8080/oauth/check_token/?token=fc9e4ad4-d6e8-4f57-b67e-c0285dcdeb58
{"scope":["read","write"],"active":true,"exp":1544940147,"authorities":["ROLE_USER"],"client_id":"ger-client-id"}