Динамическая передача параметров из базы данных SQL в url
У меня есть база данных, в которой лежат данные зарегистрированных пользователей. Мне нужно брать данные пользователя, который авторизовался на сайте, и добавить их в url адрес, чтобы работал @RequestParam, который я добавил в контроллер.(url адрес должен динамически создаваться таким - localhost:8080/schedule?age={age}.
Мой контроллер:
@Controller
public class PageController {
@Autowired
private CustomUserDetailsService customUserDetailsService;
@RequestMapping("/page")
public String schedulePage(@RequestParam("age") int age, Model model) {
model.addAttribute("users", customUserDetailsService.listAllUsers());
return "Page";
}
}
Entity-класс(таблица из БД):
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, length = 45, nullable = false)
private String login;
@Column(length = 45, nullable = false)
private String passwordof;
@Column(nullable = false)
private int age;
Геттеры и сеттеры.
}
Репозиторий:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.login = ?1")
User findByLogin(String login);
}
Сервис:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository repository;
public List<User> listAllUsers(){
return repository.findAll();
}
@Override
public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException {
User user = repository.findByLogin(login);
if(user == null){
throw new UsernameNotFoundException("Login does not exist");
}
return new CustomUserDetails(user);
}
}
В репозитории и сервисе хранятся методы для авторизации пользователя. Также есть класс, который реализовывает Спринговый интерфейс UserDetails. Каким способом лучше это сделать? Заранее спасибо.
Ответы (1 шт):
Если вам на постоянной основе нужно чтобы во все урлы подставлялись параметры пользователя, пока он авторизован - вам проще запомнить их через сессию,
@PostMapping
public String login(HttpServletRequest request){
//....
request.getSession().setAttribute("user",user);
return "index";
}
@GetMapping
@RequestMapping("/page")
public String schedulePage(HttpServletRequest request, Model model) {
User user=(User)request.getSession().getAttrubute("user");
model.addAttribute("currentUserAge", user.age());
model.addAttribute("users", customUserDetailsService.listAllUsers());
return "Page";
}
@GetMapping
public String logout(HttpServletRequest request){
request.getSession.invalidate();
return "login";
}
Либо, обогатить вашу реализацию UserDetails нужными данными, и тогда вы сможете получать текущего принципала одной строкой и кастовать его к вашей реализации:
@GetMapping
@RequestMapping("/page")
public String schedulePage(HttpServletRequest request, Model model) {
MyCustomUser user = (MyCustomUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
int age = user.age();
....
}
public class MyCustomUser implements UserDetails{
private final User dbUserEntity;
...
public int age(){
return dbUserEntity.age();
}
}