Авторизовать конечную точку с помощью аннотации Spring «Secure» - PullRequest
1 голос
/ 26 сентября 2019

В моем приложении Spring Boot я создал WebSecurityConfigurerAdapter со следующей конфигурацией:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
        .withUser("student").password(passwordEncoder().encode("password")).roles("STUDENT")
        .and()
        .withUser("teacher").password(passwordEncoder().encode("admin")).roles("TEACHER");
}

Я использую браузер для входа в систему и получаю токен Cookie, сохраненный как JSESSIONID.Затем я продолжаю брать этот cookie и использовать его в почтальоне как: enter image description here

При вызове следующей конечной точки из Почтальона:

@PostMapping(consumes = "application/json", produces = "application/json", path="/rest/class/{classId}/student")
@org.springframework.security.access.annotation.Secured({"ROLE_TEACHER"})

Я получаю403 Запрещено (без cookie, я получаю 401, по понятным причинам).

Я также использую следующие зависимости:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    </dependency>

Используя эти зависимости, моя страница входа в тимелист создается автоматически.

Как я могу решить эту проблему аутентификации / авторизации?

Нужно ли отключить csrf?Если нет, то как я могу использовать токен csrf в своем запросе почтальона?Я попытался добавить его в запрос заголовка Postman, используя X-CSRF-TOKEN, и использовал токен _csrf, который был отправлен бэкэнду, во время входа в систему.Если я отключу csrf, то страница входа в систему даже не появится, и я получу следующее исключение:

NotReadablePropertyException: недопустимое свойство 'Principal.authorities' класса EJB

1 Ответ

1 голос
/ 26 сентября 2019

Ваш подход действителен, но обратите внимание, что токен CSRF связан с сеансом, а идентификатор сеанса обновляется после входа в систему.
Если вы отправите токен CSRF перед входом в систему и идентификатор сеанса после входа в систему, тотокен CSRF не будет соответствовать ожидаемому токену.
Чтобы получить обновленный токен CSRF, после входа в систему вы можете перейти в браузере на страницу, которая делает требуемый POST запрос.
Затем вы можетенайдите обновленный токен CSRF на этой странице.
Например, это может быть скрытое поле ввода <input type="hidden" name="_csrf" value="123"> или метатег <meta name="_csrf" content="123"/> в зависимости от того, как вы настроили его на своей странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...