Мне нужно проверить права пользователя в моем контроллере, чтобы решить, какой список параметров отправляется в представление. Я знаю, что могу проверить, есть ли у конкретного пользователя определенные роли двумя способами:
- Метод 1 - Создать вспомогательный класс с кодом ниже: SecurityContextHolder.getContext (). getAuthentication (). getAuthorities (). stream () .anyMatch (grantAuthority -> grantAuthority.getAuthority (). equals (roleName));
- Метод 2 - добавить запрос HttpServletRequest в контроллер и затем req.isUserInRole ("ROLE_ADMIN")
Но какой путь лучше? Что касается меня, я считаю, что первый вариант более полезен, потому что я могу использовать его вне контроллера для внутренних целей.
@RequestMapping(value = "/goal/edit/{id}", method = RequestMethod.GET)
public String edit (@PathVariable Long id, Model model, RedirectAttributes redirect, HttpServletRequest req) {
Goal goal = goalService.getById(id);
//Method 1
User user = AuthUtils.getCurrentUser();
//Medhod 2
Boolean is_admin = req.isUserInRole("ROLE_ADMIN");
Iterable<Role> roles = null;
if (is_admin==true) {
roles = roleService.getAll();
}
else roles = user.getRoles();
model.addAttribute("goal", goal);
model.addAttribute("roles", roles);
return "goal_form";
}
public class AuthUtils {
public static boolean hasRole (User user, String roleName)
{
return SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(roleName));
}
}