Spring Security Oauth 2 permitAll()方法小記

9623 ワード

養鶏場の崖のそばに、イタチが碑を立てて書いた.「勇敢に飛んでいかないと、自分が空を飛ぶ鷹だとどうやって知っていますか?」
これから
イタチは毎日崖の底で落ちて死んだ鶏を食べることができます.
https://user-gold-cdn.xitu.io/2018/5/21/16382fb353742b5b?w=2250&h=1500&f=jpeg&s=317270
前言spring-security-oauth2を使用する時、.antMatchers("/permitAll").permitAll()を配置しましたが、headerAuthorization Bearer xxxxを携帯すれば、OAuth2AuthenticationProcessingFilterは正しい性をチェックします.Tokenが合法であれば、正常にアクセスできます.そうでなければ、要求は失敗します.彼の需要は、構成Tokenの時に、.permitAll()を携帯しても、直接にアクセスできます.
考えをまとめる
Spring Securityソース分析によると、Spring Security認証プロセスは、Tokenの認証が一連のフィルタチェーンとして知られている.spring-securityより前のフィルタブロッキング指定要求を定義し、OAuth2AuthenticationProcessingFilterheaderを除去すればいいです.
コードの変更
PermitAuthentication Filterクラスを追加します.Authorization Bearer xxxx種類のブロッキング指定要求を追加し、PermitAuthenticationFilter中のheaderをクリアします.
@Component("permitAuthenticationFilter")
@Slf4j
public class PermitAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        log.info("       :{}", request.getRequestURI());
        if ("/permitAll".equals(request.getRequestURI())) {

            request = new HttpServletRequestWrapper(request) {
                private Set headerNameSet;

                @Override
                public Enumeration getHeaderNames() {
                    if (headerNameSet == null) {
                        // first time this method is called, cache the wrapped request's header names:
                        headerNameSet = new HashSet<>();
                        Enumeration wrappedHeaderNames = super.getHeaderNames();
                        while (wrappedHeaderNames.hasMoreElements()) {
                            String headerName = wrappedHeaderNames.nextElement();
                            if (!"Authorization".equalsIgnoreCase(headerName)) {
                                headerNameSet.add(headerName);
                            }
                        }
                    }
                    return Collections.enumeration(headerNameSet);
                }

                @Override
                public Enumeration getHeaders(String name) {
                    if ("Authorization".equalsIgnoreCase(name)) {
                        return Collections.emptyEnumeration();
                    }
                    return super.getHeaders(name);
                }

                @Override
                public String getHeader(String name) {
                    if ("Authorization".equalsIgnoreCase(name)) {
                        return null;
                    }
                    return super.getHeader(name);
                }
            };

        }
        filterChain.doFilter(request, response);

    }
}

Permit All SecurityConfigの設定を追加します.
追加Authorization Bearer xxxxは、構成PermitAllSecurityConfigのために構成されている.
@Component("permitAllSecurityConfig")
public class PermitAllSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain,HttpSecurity> {

    @Autowired
    private Filter permitAuthenticationFilter;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(permitAuthenticationFilter, OAuth2AuthenticationProcessingFilter.class);
    }
}

MerryyouResource Server Configを修正し、指定経路に対するライセンスを追加しました.
 @Override
    public void configure(HttpSecurity http) throws Exception {

        // @formatter:off
        http.formLogin()
                .successHandler(appLoginInSuccessHandler)//       
                .and()
                .apply(permitAllSecurityConfig)
                .and()
                .authorizeRequests()
                .antMatchers("/user").hasRole("USER")
                .antMatchers("/forbidden").hasRole("ADMIN")
                .antMatchers("/permitAll").permitAll()
                .anyRequest().authenticated().and()
                .csrf().disable();

        // @formatter:ON
    }
  • 各パスについての説明参照:Spring MVCを使ってSpring SecurityOauth 2 API
  • をテストします.
    テストクラスSecurityOauth 2 Testを修正します.
    追加PermitAuthenticationFilter方法
        @Test
        public void permitAllWithTokenTest() throws Exception{
            final String accessToken = obtainAccessToken();
            log.info("access_token={}", accessToken);
            String content = mockMvc.perform(get("/permitAll").header("Authorization", "bearer " + accessToken+"11"))
                    .andExpect(status().isOk())
                    .andReturn().getResponse().getContentAsString();
            log.info(content);
        }
    
  • permitAllWithTokenTestの後ろにランダムに2つのパラメータ
  • が付いています.
    効果は以下の通りです
    permitAll SecurityConfigが設定されていない場合
    https://user-gold-cdn.xitu.io/2018/5/21/16382fc5a913c492?w=1844&h=1015&f=gif&s=4611672
    permitAll SecurityConfigを設定する場合
    https://user-gold-cdn.xitu.io/2018/5/21/16382fc5a927dc2f?w=1844&h=1015&f=gif&s=3514155
    コードのダウンロード
  • github:github.com/longfeizhen...
  • gitee:gitee.com/merryyou/se...
  • おすすめ記事
  • Javaはブロックチェーンシリーズ
  • を作成します.
  • Spring Securityソース分析シリーズ
  • Spring Data Jpaシリーズ
  • 【訳】データ構造におけるツリーに関する一切(java版)
  • SpringBoot+Docer+Git+Jenkinsは簡易的な持続的な統合と持続的な展開を実現します.
    https://user-gold-cdn.xitu.io/2018/5/16/16367d5da0881498?w=301&h=330&f=png&s=78572
    ???WeChatの手続きに関心を持ってjavaの構築師は通勤の途中でつまらないですか?まだ小説やニュースを読んでいますか?自分の技術をどうやって高めるか分かりませんか?ここにあなたが必要なjavaアーキテクチャの文章があります.1.5 w+javaエンジニアは全部見ています.何を待っていますか?