У меня есть фильтр запросов, который находится перед контроллером.Этот фильтр извлекает профиль пользователя и устанавливает свойства компонента userProfile
с областью запроса, а затем переходит к следующему фильтру.
При попытке доступа к userProfile
из фильтра свойство имеетНе удалось автоматически подключить.
При попытке автоматического подключения userProfile
из фильтра я вижу следующее исключение:
org.springframework.beans.factory.BeanCreationException: Ошибка при созданииbean-компонент с именем scopedTarget.userProfile: Scope 'request' не активен для текущего потока;рассмотрите возможность определения прокси-объекта с заданной областью действия для этого компонента, если вы собираетесь ссылаться на него из одноэлементного объекта;Вложенное исключение - java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока?Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы отобразить текущий запрос.
При попытке выполнитьдоступ к userProfile
изнутри контроллера, однако свойство было успешно подключено автоматически.
Как можно успешно подключить компонент userProfile
внутри фильтра?
Фильтр запроса:
@Component
public class JwtAuthenticationFilter extends GenericFilterBean implements Filter {
@Autowired
public UserProfile userProfile;
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain next) throws IOException, ServletException {
....
userProfile
.username(authorizedUser.username())
.email(authorizedUser.email())
.firstName(authorizedUser.firstName())
.lastName(authorizedUser.lastName());
}
}
Контроллер:
@CrossOrigin
@RestController
@RequestMapping("/users")
public class UsersController {
@Autowired
public UserProfile userProfile;
@GetMapping(
path = "/current",
produces = MediaType.APPLICATION_JSON_VALUE
)
@ResponseStatus(HttpStatus.OK)
public String currentUser() throws ResponseFormatterException {
System.out.println(userProfile.email());
}
}
Профиль пользователя:
@Component
@RequestScope
public class UserProfile {
@Getter @Setter
@Accessors(fluent = true)
@JsonProperty("username")
private String username;
@Getter @Setter
@Accessors(fluent = true)
@JsonProperty("email")
private String email;
@Getter @Setter
@Accessors(fluent = true)
@JsonProperty("firstName")
private String firstName;
@Getter @Setter
@Accessors(fluent = true)
@JsonProperty("lastName")
private String lastName;
}
Конфигурация безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfigurator extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticatingFilter jwtAuthenticatingFilter;
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(getAuthenticator());
}
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/actuator/**")
.antMatchers("/favicon.ico");
}
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/actuator/**").permitAll()
.antMatchers("/favicon.ico").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.addFilterBefore(getFilter(), SessionManagementFilter.class)
.authenticationProvider(getAuthenticator())
.exceptionHandling()
.authenticationEntryPoint(new HttpAuthenticationEntryPoint());
}
protected AbstractAuthenticator getAuthenticator() {
return new JwtAuthenticator();
}
protected AuthenticatingFilter getFilter() {
return jwtAuthenticatingFilter;
}
}