Создайте шаблон сопоставления URI, чтобы разрешить / запретить декодирование JWT - PullRequest
0 голосов
/ 01 июня 2019

Я новичок в Spring Boot и Spring Security и создаю службу API RESTful, позволяющую пользователю регистрироваться, входить в систему и выполнять другие действия в приложении.

Я использую JWT для проверки заявок и буду передавать маркер каждый раз, когда мой пользователь использует API-интерфейсы, отличные от входа и регистрации. Поэтому я хотел бы разрешить доступ к этим API, не передавая JWT, но в остальном я хочу отклонить запрос напрямую, если JWT не пройден.

У меня есть только один контроллер, который является UserController, и он отображается на путь /api/user. Это будет обслуживать следующие API -

/sign-up. Это метод POST. Я хочу, чтобы он разрешил доступ к нему без необходимости прохождения JWT.

/verify/{verificationCode} Это метод GET. Я хочу, чтобы ему был разрешен доступ к нему без необходимости прохождения JWT.

/set-password/ Это метод POST, который возвращает JWT.

/set-profile. Это метод PUT и будет использовать JWT.

Я попробовал несколько примеров по настройке WebSecurity и HttpSecurity с помощью antMatchers, а также настроил GenericFilterBean.

Я не знаю, правильный подход и помощь будет очень цениться. Я использую версию 2.1.3. Релиз Spring.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Вы можете выполнить ваши требования с помощью следующих конфигураций.Это хороший способ использовать URL-адреса, для которых не требуется помещать аутентификацию / авторизацию в WebSecurity using ignoring instead of HttpSecurity as WebScurity will bypass the Spring Security Filter Chain and reduce the execution time

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/sign-up")
        .antMatchers("/verify/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/set-password/").hasRole("yourROLE")
        .antMatchers("/set-profile").hasRole("yourROLE") 
        .anyRequest().authenticated();
}

Когда вы используете HttpSecurity и пытаетесь permitAll() запросов.Ваши запросы будут разрешены для доступа из цепочки фильтров Spring Security.Это дорого, так как будут запросы на другие запросы, которые также входят в эту цепочку фильтров, которые должны быть разрешены или запрещены на основе аутентификации / авторизации

Но когда вы используете WebSecurity, любые запросы к sign-up or verifyбудет полностью проходить цепь фильтра безопасности Spring все вместе.Это безопасно, потому что вам не нужна никакая аутентификация / авторизация, чтобы увидеть изображение или прочитать файл javascript.

1 голос
/ 01 июня 2019

Вы можете настроить безопасность для каждого URL-адреса, настроив HttpSecurity:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //Ignore other configuration stuff for simplicity 
        http.authorizeRequests()
                .antMatchers("/sign-up" ,"/verify/**" ).permitAll()
                .anyRequest().authenticated()
    }

}

Тогда для всех запросов к URL-адресу, кроме /sign-up и /verify/**, требуется аутентификация (что в вашем случае означает JWT).

Вы можете даже сделать следующее, если хотите дополнительно контролировать /sign-up и /verify/**, к которым можно получить доступ только без аутентификации только для правильных методов HTTP:

http.authorizeRequests()
  .antMatchers(HttpMethod.POST, "/sign-up").permitAll()
  .antMatchers(HttpMethod.GET, "/verify/**").permitAll()
  .anyRequest().authenticated()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...