Java Spring Security中获取用户角色的最佳方法

Java Spring Security中获取用户角色的最佳方法,java,spring-security,Java,Spring Security,我需要检查控制器中的用户权限,以确定哪些参数列表正在发送到视图。 我知道我可以通过两种方式检查特定用户是否具有特定角色: 方法1-使用以下代码创建助手类: SecurityContextHolder.getContext().getAuthentication().GetAuthories().stream() .anyMatch(grantedAuthority->grantedAuthority.getAuthority().equals(roleName)) 方法2-将HttpServle

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

  • 方法1-使用以下代码创建助手类: SecurityContextHolder.getContext().getAuthentication().GetAuthories().stream() .anyMatch(grantedAuthority->grantedAuthority.getAuthority().equals(roleName))
  • 方法2-将HttpServletRequest请求添加到控制器,然后添加req.isUserInRole(“角色\管理员”)
  • 但是哪条路最好?对我来说,我认为第一个更有用,因为我可以在控制器外部使用它来实现内部目的

        @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";
        }
    
    作为:


    这不是你喜欢哪一个,你需要哪一个! 是否需要检查控制器外部的用户角色?如果是,则您可以使用第一个角色,但如果您不需要控制器外部的用户角色,则第二种方式更快


    我需要检查控制器之外的用户角色,我将使用“用户优先”方法。

    这不是关于您喜欢哪一个,而是您需要哪一个!您是否需要检查控制器外部的用户角色?如果是,则您可以使用第一个角色,但如果您不需要控制器外部的用户角色,则第二种方法是faster@AMA非常感谢。
    
        public class AuthUtils {
        public static boolean hasRole (User user, String roleName)
            {
                return SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
                        .anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(roleName));
            }
        }