java - 在 Spring Security 中获取用户角色的最佳方式
问题描述
我需要检查控制器中的用户权限,以决定将哪些参数列表发送到视图。我知道我可以通过两种方式检查特定用户是否具有特定角色:
- 方法 1 - 使用以下代码创建帮助程序类: SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream() .anyMatch(grantedAuthority -> grantAuthority.getAuthority().equals(roleName));
- 方法 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));
}
}
解决方案
正如AMA 在评论中的回答:
不是你喜欢哪一个,你需要哪一个!如果是,您是否需要检查控制器外部的用户角色,那么您使用第一个是正确的,但如果您在控制器外部不需要它,则第二种方法更快
我需要检查控制器之外的用户角色,我将使用第一种方法。
推荐阅读
- java - AWS Java SDK SQSlistener 端点问题
- c++ - 为什么将 std::lock 放在 std::lock_guard 之前
- ruby - 如何在 ruby 中根据 UUID 生成 UTID?
- sql-server - 使用多行从 vb.net 更新存储过程
- scala - 在 Spark 中优化分区数据
- python - [-2:] 和 [2:] 有什么区别?
- javascript - mongoDB 集合中的 Meteor 新字段在 js 文件中有效,但在 html 模板中无效
- algorithm - 在图中查找指定边
- typo3 - TYPO3 自己的扩展详细信息页面,带有表单和计数器
- selenium - 在 Selenium Grid 中使用无头 Chrome 进行测试