#java #spring #spring-security
#java #spring #spring-безопасность
Вопрос:
Я разрабатываю API с доступом к различным конечным точкам в зависимости от ролей пользователей. API работает, но он не предоставляет доступ на основе ролей, как ожидалось. Я имею в виду, что на основе роли не применяется никаких ограничений, оно работает одинаково для разных ролей. Было бы здорово, если бы кто-нибудь мог помочь мне разобраться в проблеме. Спасибо!
WebSecurity.java
package com.project.techupdate.security;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
private UserDetailsServiceImpl userDetailsService;
private BCryptPasswordEncoder bCryptPasswordEncoder;
public WebSecurity(UserDetailsServiceImpl userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) {
this.userDetailsService = userDetailsService;
this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}
@Override
protected void configure(HttpSecurity http) throws Exception{
http.cors().and().csrf().disable().authorizeRequests()
.antMatchers(HttpMethod.POST,"/file/file-upload").hasAuthority("ADMIN")
.antMatchers(HttpMethod.POST,"/data/add-data").hasAuthority("ADMIN")
.antMatchers(HttpMethod.GET,"/data").hasAnyAuthority("ADMIN","USER")
.antMatchers(HttpMethod.POST, SecurityConstants.SIGN_UP_URL).permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JWTAuthenticationFilter(authenticationManager()))
.addFilter(new JWTAuthorizationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception{
return super.authenticationManagerBean();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.parentAuthenticationManager(authenticationManagerBean())
.userDetailsService(userDetailsService)
.passwordEncoder(bCryptPasswordEncoder);
}
}
Ответ №1:
При использовании методов hasAuthority или hasAnyAuthority вам необходимо точно соответствовать строке имени полномочий, поэтому вам, вероятно, просто нужно добавить префикс «ROLE_» или использовать hasRole и hasAnyRole при настройке spring security в WebSecurity.java .
При создании имени роли, если вы явно не добавили префикс «ROLE_» к своему имени роли, spring сделал это за вас в соответствии с документами:
По умолчанию, если предоставленная роль не начинается с ‘ROLE_’, она будет добавлена. Это можно настроить, изменив defaultRolePrefix в DefaultWebSecurityExpressionHandler.
Методы hasRole и hasAnyRole позволяют обращаться к имени роли без префикса:
… поскольку мы вызываем метод hasRole, нам не нужно указывать префикс «ROLE_».
Вы можете проверить документацию Spring Security по управлению доступом на основе выражений здесь
Комментарии:
1. Спасибо за ваш ответ. Дело в том, что теперь никакие роли не могут отправлять запрос. Статус оказывается 403 для любой из ролей