У меня есть веб-приложение, состоящее из 2 частей. Один с веб-интерфейсом (Vaadin), где я хочу, чтобы пользователь вошел в систему через OAuth2. Затем я проверяю, есть ли у пользователя определенная роль или нет. -> Если пользователь открывает URL, он должен быть автоматически перенаправлен на OAuthLogin. -> Это работает с @ EnableOAuthSso.
Вторая часть - это REST-API приложения, который находится в каталоге / api / *. fé. / api / devices должен дать мне список, если у Get-Request есть действительный Bearer-Token. Если запрос GET не имеет токена-носителя или неправильной роли (органа), если вы хотите получить 403.
Теперь это моя конфигурация:
@Configuration
@EnableOAuth2Sso
public class ProdWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
private static final String ADMIN_ROLE= "role.global.admin";
private static final String READ_API_ROLE= "role.base.read.api";
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/login**", "/error**").permitAll()
.antMatchers("/*").hasAuthority(ADMIN_ROLE)
.antMatchers("/api/**").hasAnyAuthority(ADMIN_ROLE, READ_API_ROLE)
.and().logout().permitAll().logoutSuccessUrl(rootAuthUri + "/connect/endsession")
;
}
Теперь при открытии, например, / manageDevices в браузере Я вынужден войти в систему через Auth-Code-Flow, и все работает как положено.
Когда я пытаюсь открыть / api / devices, я также вынужден войти в систему через Oauth. Даже когда я отправляю Http-заголовок с аутентификацией: Bearer xxxxx. Каким-то образом это всегда вынуждает меня войти в Экран входа в систему из моего логина OAuth.
application.properties, эти строки определены:
base.rootauthuri=https://oauth2.mypage.ch
security.oauth2.client.clientId=client.base.parameters
security.oauth2.client.clientSecret=secret
security.oauth2.client.accessTokenUri=${base.rootauthuri}/connect/token
security.oauth2.client.userAuthorizationUri=${base.rootauthuri}/connect/authorize
security.oauth2.client.scope=openid,scope.base.parameters,role,offline_access
security.oauth2.client.clientAuthenticationScheme=form
security.oauth2.resource.userInfoUri=${base.rootauthuri}/connect/userinfo
Как я могу заставить все в / api / * не делать перенаправить на AuthenticationForm, но ответить 403, если токен носителя не отправляется. Как я могу сделать это, чтобы Проверить, имеет ли токен на предъявителя роль "READ_API_ROLE" также.