首页 > 解决方案 > 在 Spring Security 中获取用户角色的最佳方式

问题描述

我需要检查控制器中的用户权限,以决定将哪些参数列表发送到视图。我知道我可以通过两种方式检查特定用户是否具有特定角色:

  1. 方法 1 - 使用以下代码创建帮助程序类: SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream() .anyMatch(grantedAuthority -> grantAuthority.getAuthority().equals(roleName));
  2. 方法 2 - 将 HttpServletRequest req 添加到控制器,然后 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));
        }
    }

标签: javaspring-security

解决方案


正如AMA 在评论中的回答

不是你喜欢哪一个,你需要哪一个!如果是,您是否需要检查控制器外部的用户角色,那么您使用第一个是正确的,但如果您在控制器外部不需要它,则第二种方法更快

我需要检查控制器之外的用户角色,我将使用第一种方法。


推荐阅读