当前位置: 首页 > 知识库问答 >
问题:

如何使用@PreAuthorize检查用户是否具有任何角色

郭翰翮
2023-03-14

我跟随文章,https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory并创建了一个应用程序角色

使用hasAuthority,我可以验证单个角色。但是,我想允许管理员或具有参与者权限的用户。我尝试使用@PreAuthorize在多个角色中使用hasRole注释。

//  @PreAuthorize("hasAuthority('APPROLE_Admin')")
    @PreAuthorize("hasRole('Admin')")
    @GetMapping("/tutorials")
    public ResponseEntity<List<Tutorial>> getAllTutorials(@RequestParam(required = false) String title) {
        try {
            List<Tutorial> tutorials = new ArrayList<Tutorial>();

但它抛出以下错误

更新日期:2022年5月24日

此代码正在工作

 @PreAuthorize("hasAnyAuthority('APPROLE_Admin', 'APPROLE_Contributor')")

但是下面的代码引发了一个错误

 //@PreAuthorize("hasRole('ROLE_Admin')")
 //@PreAuthorize("hasAnyRole('Admin', 'Contributor')")
 //@PreAuthorize("hasAnyRole('ROLE_Admin', 'ROLE_Contributor')")

日志:

[nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : GET "/api/tutorials", parameters={}
[nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.bezkoder.spring.mssql.controller.TutorialController#getAllTutorials(String)
[nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Failed to complete request: org.springframework.security.access.AccessDeniedException: Access is denied
[nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}
[nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
[nio-8080-exec-5] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
[nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 403

共有1个答案

翟曦之
2023-03-14

Spring Security性提供了两个表达式,我们可以使用@PreAuthorize注释来检查用户角色:

要检查单个角色,我们可以使用以下代码:

@PreAuthorize("hasRole('ROLE_ADMIN')")  
@GetMapping("/user/{id}")  
public String getUser(@PathVariable("id") String id)
 { 
 ...
}

我们还可以在一个表达式中检查多个角色,如下所示:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")  
@GetMapping("/users")
  public String getUsers() 
  {
   ... 
}

在这种情况下,如果用户具有任何指定角色,则允许请求。

如果在没有适当角色的情况下调用该方法,Spring Security将引发异常并重定向到错误页面。

 类似资料:
  • 我正在使用v12在我的不和谐机器人discord.js用户信息命令。我唯一的问题是,如果一个用户没有任何角色,最高的角色显示为@@所有人,而不是@所有人。所以我想避免它,如果用户没有任何角色,它会说“这个用户在这个服务器上没有角色”。我的代码在这里(只有与角色相关的部分): 如你所见,我试着做了,但在记录时,它会显示有关用户的所有信息,而不仅仅是角色。如何检测用户是否具有任何角色?提前感谢:)

  • 问题内容: 我有一个脱机菜单,可以在网站上完美运行。用户既可以使用导航键也可以用手指滑动它来打开和关闭它。 现在,我有一个非常不错的navicon图标,当单击(并打开菜单)时,它会从菜单图标过渡到X图标,反之,当再次单击并关闭菜单时,它又会转变为X图标。Buuut,如果用户将菜单滑动到打开或关闭而不是使用导航按钮的状态,则不会触发过渡,这可能会导致UX混乱(即,菜单被关闭,并且导航按钮显示X而不是

  • 我的代码中有这一点,但当我执行命令两次(名称命令、用户和角色)时,它不会返回这条消息。它一直在说“我将[角色名]添加到[用户]”

  • 问题内容: 我对Selenium非常陌生,因此如果这是一个愚蠢的问题,我深表歉意。我已经成功地将IntelliJ(播放!框架)与Selenium连接起来,并使用firefoxDrivers创建了一些测试。 我正在尝试检查页面是否已正确验证。 长话短说,我正在选择一个像这样的元素: 我做了一些进一步的操作(清除并更改值,提交“表单”),然后我想检查输入所在的TD是否被赋予了另一个类。 因此,问题是-

  • 问题内容: 结果集没有hasNext的方法。我想检查resultSet是否有任何值 这是正确的方法吗 问题答案: 没错,最初的光标指向第一行之前,如果第一次调用,则没有数据。 如果使用此方法,则由于它现在已定位在第一行之后,因此可能必须在复位后立即调用。 但是,应该注意的是,塞弗(Seifer)在下面的回答是对该问题的更优雅的解决方案。

  • 问题内容: 我正在尝试使用量角器测试元素是否可见。元素的外观如下: 在chrome控制台中时,我可以使用此jQuery选择器测试该元素是否可见: 但是,当我尝试在量角器中执行相同操作时,在运行时出现此错误: 为什么这无效?如何使用量角器检查可见性? 问题答案: 应该这样做: 记住量角器的不是jQuery和不_尚_的一部分提供CSS选择器+伪选择