0

spring-security-oauth2 で遊んでいます。認証バックエンドを使用していくつかのマイクロサービスを構築しようとしています。

次の依存関係を持つ単純なスプリング ブート プロジェクトをセットアップしました

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.0.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

および 1 つの構成クラス

@Configuration
public class SecurityConfiguration {

    @Autowired
    @Qualifier("clientDetailsServiceBean")
    private ClientDetailsService clientDetailsService;

    @Autowired
    @Qualifier("userDetailsServiceBean")
    private UserDetailsService userDetailsService;

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true)
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Override
        @Bean(name = "authenticationManagerBean")
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().permitAll().and().userDetailsService(userDetailsService).formLogin().and().httpBasic();
        }
    }

    @Configuration
    @EnableAuthorizationServer
    public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

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

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

        @Bean
        public ApprovalStore approvalStore() throws Exception {
            TokenApprovalStore store = new TokenApprovalStore();
            store.setTokenStore(tokenStore());
            return store;
        }

        @Bean
        public TokenStore tokenStore() {
            return new InMemoryTokenStore();
        }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients.withClientDetails(clientDetailsService);
        }

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

    }

Client- と UserDetailsS​​ervice の私の実装は非常に単純で、常にオブジェクトを返します

@Service("clientDetailsServiceBean")
public class ClientDetailsServiceBean implements ClientDetailsService {

    private static final Logger LOGGER = LoggerFactory.getLogger(ClientDetailsServiceBean.class);

    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        LOGGER.info("Load client {}", clientId); 
        BaseClientDetails details = new BaseClientDetails();
        details.setClientId(clientId);
        details.setAuthorizedGrantTypes(Arrays.asList("password", "refresh_token", "client_credentials"));
        details.setScope(Arrays.asList("trust"));
        details.setAutoApproveScopes(Arrays.asList("trust"));
        details.setAuthorities(Arrays.asList(new SimpleGrantedAuthority("client_role2")));
        details.setResourceIds(Arrays.asList("clients"));
        details.setClientSecret("secret");

        return details;
    }

}
@Service("userDetailsServiceBean")
public class UserDetailsServiceBean implements UserDetailsService {
    private static final Logger LOGGER = LoggerFactory.getLogger(UserDetailsServiceBean.class);

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        LOGGER.info("Load user {}", username);
        return new User(username, "password", Arrays.asList(new SimpleGrantedAuthority("ROLE_USER")) );
    }
}

しかし、経由でaccessTokenを受信しようとすると

curl http://localhost:8081/oauth/token -d grant_type=client_credentials -d client_id=web_client -d client_secret=secret

「このリソースにアクセスするには完全な認証が必要です」というエラーが表示され、試してみると

curl http://localhost:8081/oauth/token -d grant_type=client_credentials -d client_id=web_client -d client_secret=secret --user web_client:secret

「資格情報が正しくありません」というエラーが表示されます。私の観点からは、両方とも機能するはずですが、構成が欠落しているようです。

OAuth には他にも不明な点があります。Spring-Security とカスタム ログイン フォームを使用して spring-mvc アプリケーションを構築しようとしています。認証アプリにリダイレクトせずに、春のセキュリティによってトークン要求と更新サイクルを処理することは可能ですか?

イベント ドリブン アプリケーションの場合、トークンが有効であることを確認できますか? 失敗した場合、ユーザーがボタンをクリックするとイベントが書き込まれますが、この処理には数時間かかります。ユーザー資格情報を使用してイベントを処理するにはどうすればよいですか?

4

1 に答える 1

1

内部@Configurationクラスは静的である必要があります。SecurityConfigurationアプリがまったく起動しないことに驚いています。おそらく、実際にはアプリ全体が使用されていません。

認証アプリにリダイレクトせずに、春のセキュリティによってトークン要求と更新サイクルを処理することは可能ですか?

当然。仕様の password と refresh_token 付与について読みましたか? ただし、Web UI では、ユーザーが信頼できる場所でのみ資格情報を入力できるように、(リダイレクトと共に) auth code grant を使用することを強くお勧めします。

ユーザーがボタンをクリックするとイベントが書き込まれますが、これの処理は数時間後になります。ユーザー資格情報を使用してイベントを処理するにはどうすればよいですか?

トークンの更新が最善の方法かもしれません。更新トークンを含める必要があるため、イベントは明らかに安全である必要があります。

于 2015-03-19T18:30:20.440 に答える