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ソース分析によると、Spring Security認証プロセスは、
コードの変更
PermitAuthentication Filterクラスを追加します.
追加各パスについての説明参照:Spring MVCを使ってSpring SecurityOauth 2 API をテストします.
テストクラスSecurityOauth 2 Testを修正します.
追加 が付いています.
効果は以下の通りです
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エンジニアは全部見ています.何を待っていますか?
これから
イタチは毎日崖の底で落ちて死んだ鶏を食べることができます.
https://user-gold-cdn.xitu.io/2018/5/21/16382fb353742b5b?w=2250&h=1500&f=jpeg&s=317270
前言
spring-security-oauth2
を使用する時、.antMatchers("/permitAll").permitAll()
を配置しましたが、header
にAuthorization Bearer xxxx
を携帯すれば、OAuth2AuthenticationProcessingFilter
は正しい性をチェックします.Token
が合法であれば、正常にアクセスできます.そうでなければ、要求は失敗します.彼の需要は、構成Token
の時に、.permitAll()
を携帯しても、直接にアクセスできます.考えをまとめる
Spring Securityソース分析によると、Spring Security認証プロセスは、
Token
の認証が一連のフィルタチェーンとして知られている.spring-security
より前のフィルタブロッキング指定要求を定義し、OAuth2AuthenticationProcessingFilter
のheader
を除去すればいいです.コードの変更
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
}
テストクラス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
コードのダウンロード
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エンジニアは全部見ています.何を待っていますか?