フィルタを書くために春のセキュリティJWTのログイン認証を行うには
パブリック クラス JwtAuthenticationTokenFilterは延びBasicAuthenticationFilter { @value( "$ {token.header}" ) プライベート文字列token_headerと、 @Autowired プライベートUserDetailsServiceImpl userDetailsService。 @Autowired プライベートTokenUtilsのjwtUtils。 公共JwtAuthenticationTokenFilter(AuthenticationManager authenticationManager){ スーパー(authenticationManager)。 } @Overrideは、 保護された ボイド doFilterInternal(HttpServletRequestのリクエスト、HttpServletResponseの応答れるFilterChain鎖)スローServletExceptionがは、IOException { / * IF(request.getMethod()に等しい(String.valueOf(RequestMethod.GET))){ chain.doFilter(リクエスト、レスポンス)。 返します。 } * / 文字auth_token = request.getHeader(この.token_header)。 最終的な文字列auth_token_start =「ベアラ」。 もし(StringUtils.isEmpty(auth_token)&&!{auth_token.startsWith(auth_token_start)) auth_token = auth_token.substring(auth_token_start.length())。 } 他{ // 不按规范、不允许通过验证 = auth_token ヌル; } 文字列名 = jwtUtils.getUsernameFromToken(auth_token); logger.info(String.Formatの( "ユーザー%S.のための認証の確認" 、ユーザ名)); // 構文解析上記成功した場合、トークンと、このユーザ名を取得し、権限セッションが書き込まれていない のIF(ユーザ名は=!ヌル && SecurityContextHolder.getContext()getAuthentication()==。nullが){ // ユーザーユーザーは= jwtUtils.getUserFromToken(auth_token); // UserDetailsServiceでは、データベースから取りますユーザーのUserDetailsクラスに // UserDetailsクラスユーザー権限を格納するためのエンティティクラスの春のセキュリティです UserDetails = UserDetails userDetailsService.loadUserByUsername(ユーザー名); // ユーザーを確認してくださいは、トークンが有効であるもたらす // トークン生成時間は、最後のパスワード変更前の時間であり、トークンの有効期限が切れている、トークンとuserDetailsユーザー名が同じであるが含ま // もし調べ IF (jwtUtils.validateToken(auth_token、userDetailsと)){ // 認証によって生成 UsernamePasswordAuthenticationToken認証= 新しい新しい UsernamePasswordAuthenticationTokenを(userDetailsと、ヌル、userDetails.getAuthorities()); authentication.setDetails(新しい新しい。WebAuthenticationDetailsSource()buildDetails(リクエスト)) ; logger.info(String.Formatの("セキュリティコンテキストの設定、ユーザー%sの認証" 、ユーザー名)); // 将权限写入本次会话 。SecurityContextHolder.getContext()setAuthentication(認証)。 } } chain.doFilter(リクエスト、レスポンス)。 } }
TokenUtilsは空来ないuserDetailServiceImpを注射しました
@Configuration @EnableWebSecurity パブリック クラス WebSecurityConfigは延びWebSecurityConfigurerAdapter { @Autowired プライベートUserDetailsServiceImpl userDetailsServiceと、 @Autowired プライベートJwtLoginFilter jwtLoginFilter。 @Bean @Override 公共 AuthenticationManager authenticationManagerBean()はスロー{例外を 返す スーパー)(.authenticationManagerBean。 } @Bean 公共BCryptPasswordEncoder bCryptPasswordEncoder(){ 戻り 新しい)(BCryptPasswordEncoderします。 } @Overrideは、 保護された ボイド設定(AuthenticationManagerBuilderのAUTH)をスロー例外{ auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder())。 } @Overrideは 保護され 、ボイド(HttpSecurity HTTP)の設定を投げる例外{ HTTP .authorizeRequests() .antMatchers( "/タスク/ **")を。()認証済み // 需携带有效トークン / * .antMatchers( "/管理者")。 hasAuthority( "管理者")//需拥有管理这个权限 .antMatchers( "/ ADMIN")。hasRoleも( "ADMIN" .anyRequest()。permitAll() .AND() .csrf() .DISABLE() // 春のセキュリティは、クロスドメインの処理が付属して無効に .sessionManagement() // 当社独自の戦略セッションをカスタマイズ .sessionCreationPolicy(SessionCreationPolicy.STATELESSを) //春のセキュリティは、セッション作成して使用しないように調整
.AND()
.addFilter(新新JwtLoginFilter( authenticationManagerBean() ))
.addFilter(新新JwtAuthenticationTokenFilter( authenticationManagerBeanを() ));
}
ここwebsecurityconfigでaddfFilterは、それらへの直接新しいオブジェクトだったが、注射は行っておりませんので、それは、春のコンテナに新しい主題であるので、そうではありませんでした。
春の豆を注入@Autowired、また春の豆は、それを呼び出すことができなければならない現在のクラスは、オブジェクトを取得するための新しいXXX()を使用することはできません、このようにして得られたオブジェクトが@Autowiredは豆を注入し呼び出すことはできません。
その後、直接使用または直接的な方法@Bean注釈は、カスタムフィルタを友達になれる春のコンテナに追加され@Component追加します!