Настройка безопасности Spring Boot OAuthSSO и ResourceServer - PullRequest
0 голосов
/ 09 января 2020

У меня есть веб-приложение, состоящее из 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" также.

...