Защита разных конечных точек от разных пользователей с помощью Spring Security - PullRequest
0 голосов
/ 24 марта 2020

Я работаю с веб-приложением Spring Boot 1.5.2 и хочу защитить существующие конечные точки API с помощью аутентификации HTTP Basi c.

Вот что я настроил до сих пор через Spring Security :

CustomAuthenticationProvider. java

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UserService userService;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        if (isCredentialValid(authentication)) {
            return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials().toString(), Collections.emptyList());
        }

        throw new BadCredentialsException("User authentication failed for user " + authentication.getName());
    }

    private boolean isCredentialValid(Authentication authentication) {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        User databaseUser = userService.findUserByUsername(username);

        return databaseUser != null && bCryptPasswordEncoder.matches(password, databaseUser.getPassword());
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

SecurityConfig. java

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(customAuthenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests().antMatchers("/orders/**").authenticated();
    }
}

Это прекрасно работает для одного пользователя, но у меня есть следующие требования:

Требование 1

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

POST /orders/info
GET /orders/:id

Требование 2

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

POST /orders

1 Ответ

0 голосов
/ 26 марта 2020

Мне удалось решить мою проблему, выполнив следующие действия:

  1. Назначение роли каждому пользователю (READ_ORDERS или SAVE_ORDERS)
  2. Изменение SecurityConfig в он просто настраивает базовую c аутентификацию без каких-либо antMatchers
  3. Добавление защиты уровня метода с аннотацией @PreAuthorize для методов в классе контроллера

CustomAuthenticationProvider. java

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Autowired
    private UserService userService;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        User databaseUser = userService.findUserByUsername(username);

        if (isCredentialValid(databaseUser, password)) {
            return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials().toString(), getGrantedAuthorities(databaseUser));
        }

        throw new BadCredentialsException("User authentication failed for user " + authentication.getName());
    }

    private boolean isCredentialValid(User databaseUser, String password) {
        return databaseUser != null && bCryptPasswordEncoder.matches(password, databaseUser.getPassword());
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

    private List<GrantedAuthority> getGrantedAuthorities(User user) {
        List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
        List<Role> roles = user.getRoles();

        if (roles != null) {
            for (Role role : roles) {
                grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
            }
        }

        return grantedAuthorities;
    }
}

SecurityConfig. java

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomAuthenticationProvider customAuthenticationProvider;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(customAuthenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().and()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .authorizeRequests().anyRequest().authenticated();
    }
}

OrderController. java

@RestController
@RequestMapping("/orders")
@EnableWebSecurity
public class OrderInfoController {

    @PostMapping
    @PreAuthorize("hasRole('SAVE_ORDERS')")
    public SuccessData saveOrder(@RequestBody SaveOrderRequestData request) {
        // save order code
    }

    @PostMapping
    @PreAuthorize("hasRole('READ_ORDERS')")
    @RequestMapping("/info")
    public GetOrderHeaderResponseData getOrderHeader(@RequestBody OrderRequestData request) {
        // get order header code
    }

    @GetMapping
    @PreAuthorize("hasRole('READ_ORDERS')")
    @RequestMapping("/{id}")
    public OrderData getOrderDetails(@PathVariable("id") final Long id) {
        // get order details code
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...