Я реализую метод динамической проверки ролей для запросов в configure(HTTP HttpSecurity)
с использованием класса реализации FilterInvocationSecurityMetadataSource , однако у меня возникают проблемы в методе getAttributes(Object object)
для идентификации в GETзапрашивает, что является параметром внутри адреса.Например, когда приходит запрос /api/users/user.name, метод для этого запроса равен @GetMapping("/users/{login: "+ Constants.LOGIN_REGEX +"}")
, так как я знаю, что для этого запроса строка user.name
является значением в URI на основе того, что установленов @GetMapping?
Я пытался с request.getParameterMap()
, но он всегда становится нулевым.
Что я сделал до сих пор:
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {
// ....
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.addFilterBefore(corsFilter, CsrfFilter.class)
.headers()
.frameOptions()
.disable()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.anyRequest().authenticated()
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
public <O extends FilterSecurityInterceptor> O postProcess(
O fsi) {
fsi.setSecurityMetadataSource(dynamicSecurityMetadataSource);
fsi.setAccessDecisionManager(new SecurityAccessDecisionManager());
return fsi;
}
});
}
// ...
}
Реализация FilterInvocationSecurityMetadataSource:
@Component
public class DynamicSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
@Autowired
private SystemURLRepository systemURLRepository;
@Override
public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
final HttpServletRequest request = ((FilterInvocation) object).getRequest();
// Get request method (post, get, delete, ...)
String requestMethod = request.getMethod();
// Get string url from request
String urlWithoutContextPath = request.getRequestURI().substring(request.getContextPath().length());
// Query to verify roles from URI`s
Optional<SystemURL> foundUrl = systemURLRepository.findAllByValue(urlWithoutContextPath);
// If exists in database, return Collection contains information Roles
if(foundUrl.isPresent()){
Collection<ConfigAttribute> rolesAllowed = foundUrl.get().getRolesAllowed().stream().map(this::configAttribute).collect(Collectors.toList());
return rolesAllowed;
}
return null;
}
// ...
}