В приложении Spring MVC
3 контроллера: Customer, Admin, Cook. Я добавил в проект Spring Security
. После добавления методов через Swagger
они не запускаются. Ошибок в консоли вообще нет. Только есть 1 предупреждение:
2020-05-06 16:30:13.384 WARN 7940 --- [nio-8080-exec-9] o.a.c.util.SessionIdGeneratorBase: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [247] milliseconds.
В Swagger
в JSON
сообщение выводит следующее:
{
"timestamp": "2020-05-06T13:30:13.390+0000",
"status": 403,
"error": "Forbidden",
"message": "Forbidden",
"path": "/customer/change/password"
}
Response headers
cache-control: no-cache, no-store, max-age=0, must-revalidate
connection: keep-alive
content-type: application/json
date: Wed, 06 May 2020 13:30:13 GMT
expires: 0
keep-alive: timeout=60
pragma: no-cache
transfer-encoding: chunked
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
То есть после добавления Spring Security, у меня ничего не работает. Для проверки убрал из конфига класс Customer
, но все равно его методы не работают.
//.antMatchers("/customer/**").hasRole("CUSTOMER "class in the WebSecurityConfig class;
Фронта в проекте нет вообще. Я использую только Swagger
.
WebSecurityConfig:
package com.tinychiefdelights.configs;
import com.tinychiefdelights.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// Поля
//
private UserService userService;
// Injects in SETTERS
//
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
// Methods
//
// Тут мы переопределяем метод конфигураций
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/cook/**").hasRole("COOK");
// .antMatchers("/customer/**").hasRole("CUSTOMER");
// .anyRequest().authenticated()
// .and()
// .exceptionHandling()
// .and()
// .formLogin()
// .loginPage("/login")
// .permitAll()
// .and()
// .logout()
// .permitAll();
}
// Тут мы переопределяем для работы с внешней БД
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
// Тут мы используем encoder для шифрования паролей
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// Возвращаем сервис пользовател для userDetServ
@Bean
public UserDetailsService userDetailsService() {
return userService;
}
}
CustomerController
package com.tinychiefdelights.controller;
import com.tinychiefdelights.model.*;
import com.tinychiefdelights.repository.CustomerRepository;
import com.tinychiefdelights.service.CustomerService;
import com.tinychiefdelights.service.UserService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
@Api(value = "Работа с Заказчиком", tags = {"Заказчик"})
@RestController
@RequestMapping("/customer")
public class CustomerController {
//Constructor
//
// Injects через конструктор
@Autowired
public CustomerController(CustomerRepository customerRepository, CustomerService customerService, UserService userService) {
this.customerRepository = customerRepository;
this.customerService = customerService;
this.userService = userService;
}
// Fields
// Injects into constructor
//
private final CustomerRepository customerRepository;
private final CustomerService customerService;
private final UserService userService;
// GET MAPPING
//
// POST MAPPING
//
// Сделать заказ
@PostMapping("/make/order")
public void makeOrder(String address, String phoneNumber, Long customerId,
Long cookId, @RequestParam List<Long> dishList, Date date) {
customerService.makeOrder(address, phoneNumber, customerId, cookId, dishList, date);
}
// Оставить отзыв
@PostMapping("/set/review")
public void setReview(String text, int rate, Long id) {
customerService.setReview(text, rate, id);
}
// PUT MAPPING
//
// Заказчик может редактировать свою карточку (поиск по ID)
@PutMapping("/edit/{id}")
Customer editCustomer(@PathVariable Long id, User user, @RequestParam double wallet) {
return customerService.editCustomer(id, user, wallet);
}
// Снять деньги со своего депозита (Заказчик)
@PutMapping("/{id}/withdraw/{money}")
void withdrawMoney(@PathVariable Long id, @RequestParam double money) {
customerService.withdrawMoney(id, money);
}
// Изменить свой пароль
@PutMapping("/change/password")
void changePassword(@RequestParam String login, @RequestParam String newPass) {
userService.changePassword(login, newPass);
}
// Внести деньги на счет (Заказчик)
@PutMapping("/{id}/deposit/money")
public void depositMoney(@PathVariable Long id, @RequestParam double money) {
customerService.depositMoney(id, money);
}
// Отменить Заказ
@PutMapping("/cancel/order/{id}")
public void cancelOrder(@PathVariable Long id){
customerService.cancelOrder(id);
}
// DELETE MAPPING
//
}
PS Клиент расширяется от пользователя.
Пользователь:
package com.tinychiefdelights.model;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.Collection;
import java.util.Collections;
@ApiModel
@Data
@Entity
@Table(name = "pg_user", schema = "public")
public class User implements UserDetails {
public User() { // Пустой конструктор для Hibernate
}
// Поля
private @Id
@GeneratedValue
Long id;
@Column(name = "login")
private String login;
@Size(min = 5, max = 30)
@Column(name = "password")
private String password;
@Enumerated(EnumType.STRING)
@Column(name = "role")
private Role role;
@Column(name = "name")
private String name;
@Column(name = "last_name")
private String lastName;
// Методы
//
// GrantedAuthority
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + role));
}
// userName == login (одно и тоже)
@Override
public String getUsername() {
return login;
}
// Во всех флагах стоит TRUE, так как не используются
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
//
Дорогие друзья, в чем может быть проблема? Почему перестали работать методы?