Запретить автоматическое перенаправление Spring OAuth2JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Запретить автоматическое перенаправление Spring OAuth2

Сообщение Anonymous »

Я пытаюсь следовать примеру Spring Boot OAuth2, который, к сожалению, кажется немного устаревшим. В статье описывается простое приложение Spring Boot, которое передает вход в систему поставщику аутентификации OAuth 2.0, которым в данном примере является GitHub. Теперь, как только pom.xml получит новую зависимость

Код: Выделить всё

    
org.springframework.boot
spring-boot-starter-oauth2-client

и соответствующие настройки GitHub в файле application.yml

Код: Выделить всё

spring:
application:
name: MyTestApp
security:
oauth2:
client:
registration:
github:
clientId: 983rkjhsaf809faj3
clientSecret: 0af98s09gdf8sj3l5rjadsf98a7fdvdsaf
поведение меняется таким образом, что вызов http://localhost:8080 автоматически перенаправляет на страницу входа GitHub OAuth 2.0. После входа в систему перенаправление отправляет пользователя обратно на http://localhost:8080 как вошедшего в систему пользователя, показывая содержимое index.html, определенного в проекте.
Пока это хорошо, но, возможно, корневой каталог http://localhost:8080, который является "/", также должен просматриваться пользователями, не вошедшими в систему. Отправка их на страницу входа в GitHub будет. ошибиться. Поэтому в статье предлагается расширить код с помощью класса WebSecurityConfigurerAdapter, и этот класс больше не существует для текущей версии Spring Security 6.4.1. Полагаю, показанный пример относится к Spring Security 5 (?).
Поэтому я попытался добавить конфигурацию безопасности новым способом, используя SecurityFilterChain.

Код: Выделить всё

@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/error", "/webjars/**").permitAll()
.anyRequest().authenticated()
)
.exceptionHandling(e -> e
.authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
)
.oauth2Login((oauth2Login) -> oauth2Login
.userInfoEndpoint((userInfo) -> userInfo
.userAuthoritiesMapper(grantedAuthoritiesMapper())
)
);
return http.build();
}

private GrantedAuthoritiesMapper grantedAuthoritiesMapper() {
return (authorities) -> {
Set mappedAuthorities = new HashSet();

authorities.forEach((authority) -> {
GrantedAuthority mappedAuthority;

if (authority instanceof OAuth2UserAuthority) {
OAuth2UserAuthority userAuthority = (OAuth2UserAuthority) authority;
mappedAuthority = new OAuth2UserAuthority("OAUTH2_USER", userAuthority.getAttributes());
} else {
mappedAuthority = authority;
}

mappedAuthorities.add(mappedAuthority);
});

return mappedAuthorities;
};
}
}
Здесь я четко объявляю "/" с помощью метода PermitAll(), который должен "Указать, что URL-адреса разрешены кем угодно". Поэтому я бы хотел не ждите, что Spring перенаправит пользователя на страницу входа в GitHub. Но это так! В статье также предлагается добавить метод .ExceptionHandling(...) и отправлять UNAUTHORIZED при вызове. Но теперь я всегда получаю HTTP ERROR 401 при вызове http://localhost:8080.
То, чего я хочу добиться, очень просто:
  • Я хочу, чтобы пользователи всегда могли позвонить по адресу http://localhost:8080 (следовательно, указывая на «/») независимо от того, вошли они в систему или нет. .
  • Если пользователи называют какой-либо URL другим чем те, которые определены для PermitAll(), я хочу, чтобы они получили HTTP ERROR 401.
Как я могу это сделать ? Какая часть цепочки фильтров безопасности портит эту идею?

Подробнее здесь: https://stackoverflow.com/questions/792 ... 2-redirect
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»