Я хочу настроить некоторые коды сервера авторизации OAuth, предоставляемые Spring Security. код, ответственный за генерацию / oauth / authorize, является компонентом с именем AuthorizationEndpoint. в классе AuthorizationServerEndpointsConfiguration следующий код создает компонент класса AuthorizationEndpoint:
@Bean
public AuthorizationEndpoint authorizationEndpoint() throws Exception {
AuthorizationEndpoint authorizationEndpoint = new AuthorizationEndpoint();
FrameworkEndpointHandlerMapping mapping = getEndpointsConfigurer().getFrameworkEndpointHandlerMapping();
authorizationEndpoint.setUserApprovalPage(extractPath(mapping, "/oauth/confirm_access"));
authorizationEndpoint.setProviderExceptionHandler(exceptionTranslator());
authorizationEndpoint.setErrorPage(extractPath(mapping, "/oauth/error"));
authorizationEndpoint.setTokenGranter(tokenGranter());
authorizationEndpoint.setClientDetailsService(clientDetailsService);
authorizationEndpoint.setAuthorizationCodeServices(authorizationCodeServices());
authorizationEndpoint.setOAuth2RequestFactory(oauth2RequestFactory());
authorizationEndpoint.setOAuth2RequestValidator(oauth2RequestValidator());
authorizationEndpoint.setUserApprovalHandler(userApprovalHandler());
return authorizationEndpoint;
}
Я хочу переопределить его новым пользовательским компонентом. Я создал класс, который расширяет AuthorizationEndpoint. сейчас я вставил тот же код в этот новый класс.
public class AuthorizationEndpointCustom extends AuthorizationEndpoint {
, создавая bean-компонент:
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
AuthorizationServerEndpointsConfiguration asec;
@Bean
// @Order(value = Ordered.LOWEST_PRECEDENCE)
@Primary
public AuthorizationEndpoint authorizationEndpoint () {
AuthorizationEndpointCustom authorizationEndpoint = new AuthorizationEndpointCustom();
FrameworkEndpointHandlerMapping mapping = asec.getEndpointsConfigurer().getFrameworkEndpointHandlerMapping();
authorizationEndpoint.setUserApprovalPage(extractPath(mapping, "/oauth/confirm_access"));
authorizationEndpoint.setProviderExceptionHandler(asec.getEndpointsConfigurer().getExceptionTranslator());
authorizationEndpoint.setErrorPage(extractPath(mapping, "/oauth/error"));
authorizationEndpoint.setTokenGranter(asec.getEndpointsConfigurer().getTokenGranter());
authorizationEndpoint.setClientDetailsService(clientDetailsService);
authorizationEndpoint.setAuthorizationCodeServices(asec.getEndpointsConfigurer().getAuthorizationCodeServices());
authorizationEndpoint.setOAuth2RequestFactory(asec.getEndpointsConfigurer().getOAuth2RequestFactory());
authorizationEndpoint.setOAuth2RequestValidator(asec.getEndpointsConfigurer().getOAuth2RequestValidator());
authorizationEndpoint.setUserApprovalHandler(asec.getEndpointsConfigurer().getUserApprovalHandler());
return authorizationEndpoint;
}
private String extractPath(FrameworkEndpointHandlerMapping mapping, String page) {
String path = mapping.getPath(page);
if (path.contains(":")) {
return path;
}
return "forward:" + path;
}
, когда я пытаюсь создать bean-компонент этого нового класса, я сталкиваюсь со следующим ошибка:
Приложение не удалось запустить
Описание:
Компонент authorizationEndpoint, определенный в org.springframework.security.oauth2.config. annotation.web.configuration.AuthorizationServerEndpointsConfiguration, не удалось зарегистрировать. Компонент с таким именем уже определен в ресурсе пути к классу [com / example / demo / AuthorizationServerConfig.class], и переопределение отключено.
Действие:
Рассмотрите возможность переименования одного из компонентов или включив переопределение, установив spring.main.allow-bean-definition-overriding = true
, ошибка исчезнет, добавив предложенный конфиг в application.properties. но новый компонент не заменяет базовый компонент. в другой части моего кода я получил доступ к AuthorizationEndpoint из applicationContext. Я вызвал .getClass () этого объекта, и это тот же бин из фреймворка:
"org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint"
как я могу заставить пружину использовать мой боб?