web-dev-qa-db-ja.com

春のセキュリティOAuth2-カスタムClientDetailsS​​ervice

現在、Oauth2認証用のSpringアプリに取り組んでいますが、カスタムClientDetailsS​​erviceの実装で問題が発生しました。

クライアント情報がアプリに保存されていないため、一般的なinMemoryまたはjdbc clientDetailsS​​erviceを使用できません。外部のWebサービスから取得します。しかし、カスタムClientDetailServiceを設定すると、access_confirmationページが表示されなくなります(空白のページが表示されます)。

私の問題を示すために、私は自分のアプリを使用していませんが、公式の春のバニラテストを使用しています--security-oauthプロジェクト spring-security-oauth

アプリケーションコードは次のとおりです。

@SpringBootApplication
@EnableResourceServer
@RestController
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RequestMapping("/")
    public String home() {
        return "Hello World";
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public String create(@RequestBody MultiValueMap<String, String> map) {
        return "OK";
    }

    @Configuration
    @EnableAuthorizationServer
    protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {

        @Autowired
        private AuthenticationManager authenticationManager;

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints.authenticationManager(authenticationManager);
        }

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

        public ClientDetailsService clientDetailsService() {
            return new ClientDetailsService() {
                @Override
                public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
                    BaseClientDetails details = new BaseClientDetails();
                    details.setClientId(clientId);
                    details.setAuthorizedGrantTypes(Arrays.asList("authorization_code") );
                    details.setScope(Arrays.asList("read, trust"));
                    details.setResourceIds(Arrays.asList("oauth2-resource"));
                    Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
                    authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT"));
                    details.setAuthorities(authorities);
                    return details;
                }
            };
        }  //*/


        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            // @formatter:off

            clients.withClientDetails(clientDetailsService());

            /*clients.inMemory()
                .withClient("test")
                    .authorizedGrantTypes("authorization_code")
                    .authorities("ROLE_CLIENT")
                    .scopes("read", "trust")
                    .resourceIds("oauth2-resource");
            //*/
            // @formatter:on
        }
    }

}

ご覧のとおり、カスタムclientDetailsS​​erviceを追加し、ClientDetailsS​​erviceconfigurer構成を変更して、メモリ内のclientDetailsS​​erviceの代わりに設定します。

私の問題は、トークンを取得しようとすると、ユーザーをログに記録した後、access_confirmationページが表示されなくなることです。

問題が見つかりました。clientDetailsでのスコープの定義が間違っていました。 Arrays.asList( "read"、 "trust")の代わりにArrays.asList( "read、trust")がありました

私は何かを逃しましたか?カスタムclientDetailsS​​erviceを別の場所に設定する必要がありますか?

7
benedick steve

次のようにClientDetailsimplを変更してみてください。

public ClientDetailsService clientDetailsService() {
        return new ClientDetailsService() {
            @Override
            public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
                BaseClientDetails details = new BaseClientDetails();
                details.setClientId(clientId);
                details.setAuthorizedGrantTypes(Arrays.asList("authorization_code") );
                details.setScope(Arrays.asList("read, trust"));
                details.setRegisteredRedirectUri(Collections.singleton("http://anywhere.com"));
                details.setResourceIds(Arrays.asList("oauth2-resource"));
                Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
                authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT"));
                details.setAuthorities(authorities);
                return details;
            }
        };
    }  //*/
6
vmarusic