当前位置: 首页 > 知识库问答 >
问题:

Spring Security OAuth-如何启用私有或公共访问令牌访问不同的资源?

祁烈
2023-03-14

我有两个终点。

是一个内部(半私有)endpoint。仅允许配置的客户端使用。(不需要用户名和凭据;但clientID就足够了)

问候语是专用endpoint。仅允许客户端和用户配置。(需要clientID、用户名和密码)

以下是配置。

@Configuration
public class OAuth2ServerConfiguration {

    private static final String RESOURCE_ID = "restservice";

    @Configuration
    @EnableResourceServer
    protected static class ResourceServerConfiguration extends
            ResourceServerConfigurerAdapter {

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {
            // @formatter:off
            resources
                .resourceId(RESOURCE_ID);
            // @formatter:on
        }

        @Override
        public void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            http
                .authorizeRequests()
                    .antMatchers("/users").hasRole("ADMIN")
                    .antMatchers("/greeting").authenticated()
                    .antMatchers("/foo").authenticated();
            // @formatter:on
        }

    }

    @Configuration
    @EnableAuthorizationServer
    protected static class AuthorizationServerConfiguration extends
            AuthorizationServerConfigurerAdapter {

        private TokenStore tokenStore = new InMemoryTokenStore();

        @Autowired
        @Qualifier("authenticationManagerBean")
        private AuthenticationManager authenticationManager;

        @Autowired
        private CustomUserDetailsService userDetailsService;

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints)
                throws Exception {
            // @formatter:off
            endpoints
                .tokenStore(this.tokenStore)
                .authenticationManager(this.authenticationManager)
                .userDetailsService(userDetailsService);
            // @formatter:on
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            // @formatter:off
            clients
                .inMemory()
                    .withClient("clientapp")
                        .authorizedGrantTypes("password", "refresh_token","authorization_code")
                        .authorities("USER","ROLE_CLIENT")
                        .scopes("read", "write")
                        .resourceIds(RESOURCE_ID)
                        .secret("123456")
                        .accessTokenValiditySeconds(600);
            // @formatter:on
        }

        @Bean
        @Primary
        public DefaultTokenServices tokenServices() {
            DefaultTokenServices tokenServices = new DefaultTokenServices();
            tokenServices.setSupportRefreshToken(true);
            tokenServices.setTokenStore(this.tokenStore);
            return tokenServices;
        }

        @Override
        public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
        {
           oauthServer.checkTokenAccess("permitAll()");
        }

    }

}

这是控制器

@RestController
public class GreetingController {

    private static final String template = "Hello, %s! your password is %s";

    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@AuthenticationPrincipal User user) {
        return new Greeting(counter.incrementAndGet(), String.format(template, user.getName(),user.getPassword()));
    }

    @RequestMapping("/foo")
    public String foo(@AuthenticationPrincipal User user) {
        System.out.println(user==null);
        return "you are permitted here";
    }

}

我不能访问http://localhost:9001/foo没有任何令牌。所以当我尝试使用下面的curl获取访问令牌时(注意我不传递用户名和密码,只传递client_id和client_secret)

Curl-X POST-vu clientapp: 123456http://localhost:9001/oauth/token-H"接受:应用程序/json"-d"grant_type=密码

我得到这个错误

{"error":"invalid_grant","error_description":"Bad credentials"}

我的配置有问题。我是使用Spring SecurityOAuths的初学者。请在这里提供任何帮助。

谢啦


共有1个答案

应翰飞
2023-03-14

我想你传错了。。。

curl -X POST -vu clientapp:123456 http://localhost:9001/oauth/token -H "Accept: application/json" -d "grant_type=client_credentials&scope=read%20write&client_secret=123456&client_id=clientapp"

另外,据我所知,您不应该在请求的头和正文中重复client_idclient_secret...只有头应该就足够了

 类似资料:
  • 我使用postMan,输入请求地址http://localhost:8011/umrah/oauth/token?client_id=client_2&username=1234567&password=123456&grant_type=password&client_secret=123456,点击send按钮,出现错误,在内存中工作正常,当我想使用Jdbc令牌存储时,想法控制台错误:找不到令

  • 我有一节课: 在正常使用中,该类的行为与您预期的一样。方法和获取并设置复合列表。然而,我使用这个类作为一个对象,在使用JAX-WS构建的web服务中传递。当JAX-WS编译器看到这个类时,它会忽略和访问器,XSD中出现的唯一属性是。 在一天的大部分时间里,我的头撞在墙上,我决定尝试将私有方法的名称改为,突然间一切都如你所料。JAX-WS为属性创建了正确的模式。 似乎正在发生的事情是,JAX-WS看

  • 我想做基于令牌的机制,我将有要么温泉或移动应用程序支持多个客户端。 我的web服务引擎和应用程序的用例: 我的web应用程序:客户将注册他们的应用程序,无论是SPA还是移动应用程序。他们将在注册时获得客户id。在SPA或移动应用程序的情况下,只有作为密钥的客户端id会被泄露,因此我只提供客户端id。 Web服务引擎:支持多个客户端,登录客户端各自的应用程序后管理每个用户的会话。 因此,假设有 2

  • 访问令牌凭据(以及任何机密的访问令牌属性)在传输和储存时必须保持机密性,并只与授权服务器、访问令牌生效的资源服务器和访问令牌被颁发的客户端共享。访问令牌凭据必须只能使用带有RFC2818定义的服务器身份验证的1.6节所述的TLS 传输。 当使用隐式授权许可类型时,访问令牌在URI片段中传输,这可能泄露访问令牌给未授权的一方。 授权服务器必须确保访问令牌不能被生成、修改或被未授权一方猜测而产生有效的

  • 访问令牌是用于访问受保护资源的凭据。访问令牌是一个代表向客户端颁发的授权的字符串。该字符串通常对于客户端是不透明的。令牌代表了访问权限的由资源所有者许可并由资源服务器和授权服务器实施的具体范围和期限。 令牌可以表示一个用于检索授权信息的标识符或者可以以可验证的方式自包含授权信息(即令牌字符串由数据和签名组成)。额外的身份验证凭据——在本规范范围以外——可以被要求以便客户端使用令牌。 访问令牌提供了

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode