プロジェクトにSpringSecurityを実装したいと思います。しかし、何をしようとしても同じエラーが発生し続けます。
私は必要なクラスを作成しました(TokenUtils
、AuthenticationTokenFilter
、SpringConfiguration
)。それらは同じパッケージの下にありますが、次のエラーが発生します。
これはStack Trace
問題が発生する私の一部です
2018-12-31 23:58:10.616 INFO 9952 --- [main] j.LocalContainerEntityManagerFactoryBean:永続性ユニットの初期化されたJPA EntityManagerFactory'default '2018-12-31 23:58:11.444 ERROR 9952 --- [main] osbweb .embedded.tomcat.TomcatStarter:Tomcatコンテキストの開始中にエラーが発生しました。例外:org.springframework.beans.factory.UnsatisfiedDependencyException。メッセージ:「authenticationTokenFilterBean」という名前のBeanの作成中にエラーが発生しました:フィールド「tokenUtils」で表現された依存関係が満たされていない。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:タイプ 'com.sbvtransport.sbvtransport.security.TokenUtils'の適格なBeanがありません:autowire候補として適格な少なくとも1つのBeanが必要です。依存関係のアノテーション:{@ org.springframework.beans.factory.annotation。Autowired(required = true)} 2018-12-31 23:58:11.479 INFO 9952 --- [main] o.apache.catalina.core.StandardService:サービスを停止しています[Tomcat] 2018-12-31 23:58:11.495警告9952 --- [main] oacloader.WebappClassLoaderBase:Webアプリケーション[ROOT]は、[HikariPool-1ハウスキーパー]という名前のスレッドを開始したようですが、停止できませんでした。これにより、メモリリークが発生する可能性が非常に高くなります。スレッドのスタックトレース:[email protected]/jdk.internal.misc.Unsafe.park(ネイティブメソッド)[email protected]/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java: 234)[email protected]/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2123)[email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take( ScheduledThreadPoolExecutor.java:1182)[email protected]/java.util。WebappClassLoaderBase警告:-illegal-access = warnを使用して、さらに違法なリフレクティブアクセス操作の警告を有効にします警告:すべての違法アクセス操作は、将来のリリースで拒否されます2018-12-31 23:58:11.502 WARN 9952 --- [main ] ConfigServletWebServerApplicationContext:コンテキストの初期化中に例外が発生しました-更新の試行をキャンセルします:org.springframework.context.ApplicationContextException:Webサーバーを起動できません。ネストされた例外はorg.springframework.boot.web.server.WebServerExceptionです:組み込みTomcatを開始できません2018-12-31 23:58:11.502 INFO 9952 --- [main] j.LocalContainerEntityManagerFactoryBean:永続ユニットのJPAEntityManagerFactoryを閉じています 'デフォルト'2018-12-31 23:58:11.502 INFO 9952 --- [main] com.zaxxer.hikari.HikariDataSource:HikariPool-1-シャットダウンが開始されました... 2018-12-31 23:58:11.517 INFO 9952 --- [main] com.zaxxer.hikari.HikariDataSource:HikariPool-1-シャットダウンが完了しました。2018-12-31 23:58:11.533 INFO 9952 --- [メイン] ConditionEvaluationReportLoggingListener:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-12-31 23:58:11.845 ERROR 9952 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Field tokenUtils in com.sbvtransport.sbvtransport.security.AuthenticationTokenFilter required a bean of type 'com.sbvtransport.sbvtransport.security.TokenUtils' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.sbvtransport.sbvtransport.security.TokenUtils' in your configuration.
package com.sbvtransport.sbvtransport.security;
これらは私のセキュリティクラスです:
AuthenticationTokenFilter
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter{
@Autowired
TokenUtils tokenUtils;
@Autowired
private UserDetailsService userDetailsService;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String authToken = httpRequest.getHeader("Authorization");
String username = tokenUtils.getUsernameFromToken(authToken);
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if (tokenUtils.validateToken(authToken, userDetails)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
chain.doFilter(request, response);
}
}
Tokenutils
package com.sbvtransport.sbvtransport.security;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class TokenUtils {
@Value("SuperSecreat")
private String secret;
@Value("86400") // 24 hours(in seconds)
private Long expiration;
public String getUsernameFromToken(String token) {
String username;
try {
Claims claims = this.getClaimsFromToken(token);
username = claims.getSubject();
} catch (Exception e) {
username = null;
}
return username;
}
private Claims getClaimsFromToken(String token) {
Claims claims;
try {
claims = Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token).getBody();
} catch (Exception e) {
claims = null;
}
return claims;
}
public Date getExpirationDateFromToken(String token) {
Date expirationDate;
try {
final Claims claims = this.getClaimsFromToken(token);
expirationDate = claims.getExpiration();
} catch (Exception e) {
expirationDate = null;
}
return expirationDate;
}
private boolean isTokenExpired(String token) {
final Date expirationDate = this.getExpirationDateFromToken(token);
return expirationDate.before(new Date(System.currentTimeMillis()));
}
public boolean validateToken(String token, UserDetails userDetails) {
final String username = getUsernameFromToken(token);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<String, Object>();
claims.put("sub", userDetails.getUsername());
claims.put("created", new Date(System.currentTimeMillis()));
return Jwts.builder().setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
}
SecurityConfiguration
package com.sbvtransport.sbvtransport.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@SpringBootApplication
@Configuration
@EnableWebSecurity
@EnableAutoConfiguration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(this.userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public AuthenticationTokenFilter authenticationTokenFilterBean() throws Exception {
AuthenticationTokenFilter authenticationTokenFilter = new AuthenticationTokenFilter();
authenticationTokenFilter.setAuthenticationManager(authenticationManagerBean());
return authenticationTokenFilter;
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests().antMatchers("").permitAll();
httpSecurity.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
}
}
AuthenticationTokenFilter内のTokenUtilsの自動配線に問題があるようですが、私も間違っている可能性があります。
私の質問が十分に明確であることを願っています。それを改善するために何かできることがあれば、それを提案してください。
エラー:エラーメッセージには、TokenUtils
Beanが見つからないことが明確に示されています
「com.sbvtransport.sbvtransport.security.TokenUtils」が見つかりませんでした。
アプリケーションコンテキストでこのクラスのシングルトンBeanを作成するために、makesコンポーネントスキャンを使用してクラスを宣言@Component
するとTokenUtils
、が欠落してい@Component
ます。
@Component
public class TokenUtils {
そして、@Configuration
上AuthenticationTokenFilter
@Configuration
public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter{
@SpringBootApplicationは、宣言されたパッケージ内のコンポーネントスキャンを有効にします
@EnableAutoConfiguration:SpringBootの自動構成メカニズムを有効にします
@ComponentScan:アプリケーションが配置されているパッケージで@Componentスキャンを有効にします(ベストプラクティスを参照)
@Configuration:コンテキストに追加のBeanを登録したり、追加の構成クラスをインポートしたりできます
@SpringBootApplicationアノテーションは、@ Configuration、@ EnableAutoConfiguration、および@ComponentScanをデフォルトの属性で使用するのと同じです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加