2016-05-05 5 views
9

で、私は私のサーバーは、トークン春のブート1.3.3 @EnableResourceServerとEnableOAuth2Sso @同時に

をベアラアクセスを受け入れることができResourceServer、なりたいなトークンが存在しない場合はしかし、私が使用したいです私のユーザーを認証するOAuth2Server。

@Configuration 
@EnableOAuth2Sso 
@EnableResourceServer 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{ 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().authenticated(); 
    } 
} 

ただし、この場合では、唯一の@EnableResourceServer注釈作品:

は、私は次のようにやってみてください。それは、しかし、

Full authentication is required to access this resource 

を返し、私は @Orderは私が @Order(0)注釈を追加した場合、 私は、ログインページにリダイレクトされます、重要であると述べた

ログインページに私をリダイレクトしていないI Httpヘッダーのaccess_tokenで自分のリソースにアクセスできません:

Authorization : Bearer 142042b2-342f-4f19-8f53-bea0bae061fc 

どのように目標を達成できますか?私はそれが同時にアクセストークンとSSOを使用したい。

ありがとう〜

答えて

4

同じリクエストで両方の設定を使用するとあいまいです。いくつかのそのためのソリューションが、個別の要求グループを定義することがより明確があるかもしれません:

  • OAuth2Sso:ユーザーがブラウザから来て、私たちは、トークン
  • の認証プロバイダにリダイレクトしたいですResourceServer:通常のAPIリクエストのため、彼らはこれを達成するために

(おそらく同じ認証プロバイダから)どこから得たトークンを使用して来て、リクエスト照合と構成を分離:

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Bean("resourceServerRequestMatcher") 
    public RequestMatcher resources() { 
     return new AntPathRequestMatcher("/resources/**"); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http 
      .requestMatcher(resources()).authorizeRequests() 
      .anyRequest().authenticated(); 
    } 

} 

とSSOフィルタチェーンからこれらを除外:両方同じのOAuth2を使用する設定を

@Configuration 
@EnableOAuth2Sso 
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    @Qualifier("resourceServerRequestMatcher") 
    private RequestMatcher resources; 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     RequestMatcher nonResoures = new NegatedRequestMatcher(resources); 
     http 
      .requestMatcher(nonResoures).authorizeRequests() 
      .anyRequest().authenticated(); 
    } 
} 

そして、この場合にはもちろん/resources/**

の下にあるすべてのリソースを置く(accessTokenUrijwt.key-value等)

更新1:

実際には上記の構成のため、この要求マッチャを使用して、当初の目標を達成することができます

new RequestHeaderRequestMatcher("Authorization") 

アップデート2: (@のSID-moradさんのコメントの説明)

春のセキュリティフィルタを作成しますチェーンごとに設定します。各フィルタチェーンのリクエストマッチャは、設定の順番で評価されます。 WebSecurityConfigurerAdapterのデフォルト注文は100で、ResourceServerConfigurationの注文はデフォルトで3です。つまり、最初にResourceServerConfigurationのリクエストマッチャーが評価されます。そうです、リクエストマッチャは、上記サンプル中SsoSecurityConfigurationには必要ありません

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration configuration; 

    @PostConstruct 
    public void setSecurityConfigurerOrder() { 
     configuration.setOrder(3); 
    } 
... 
} 

 

@Configuration 
@EnableOAuth2Sso 
@Order(100) 
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter { 
... 
} 

:この順序は、のように、これらの構成に上書きすることができます。しかし、後ろの理由を知っていいよ:)

+0

あなたの答えは私のために役立った、ありがとう!私の場合、 'new NegatedRequestMatcher(resources)'の部分は必要ではないことを指摘したいと思います。 –

+0

こんにちは、ありがとう!元の投稿のUPDATE2セクションにあなたのコメントを記載しました。 – plajko

関連する問題