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

来自请求参数的JWT Spring Security用户授权

吕文林
2023-03-14

我正在使用JWT和spring security来处理RESTAPIendpoint的授权。在以下示例中,endpoint提供有关用户的信息。假设我只希望管理员用户能够获得所有用户的详细信息,任何其他用户都应该只获得其帐户详细信息。有谁能想出一种更具声明性的方法来使用注释或AOP实现与以下代码等效的代码吗。

@RequestMapping(value = "user/{userId}", method = RequestMethod.GET)
@PreAuthorize("hasAnyRole('USER', 'ADMIN')")
public UserDetailsDto getUserDetails(
        @AuthenticationPrincipal JwtUser user, 
        @PathVariable String userId) {
    if (!user.getId().equals(userId) && user.getRole != Role.ADMIN)
        throw new BadCredentialsException("Jwt token id and requested ids do not match");
    //handle the request
}

共有1个答案

湛嘉歆
2023-03-14

您可以将此方法上运行的Aspect定义为切入点引用。

>

  • 在项目中包括aop。(包括与apring aop相关的JAR,在spring boot中包括spring boot starter aop。)
  • 在应用程序配置中启用AOP(使用@enableSpectJautoproxy注释注释配置类)
  • 定义您的方面并在建议之前配置以在那里执行您的逻辑。如:

    @Aspect
    @Component
    public class Test {
    
        @Before("execution(* com.package.name.*.getUser(..)) && args(user,dto)")
        public void getAllAdvice(JwtUser user, GetUserRequestDto dto){
            System.out.println("Service method getter called");
            if (!user.getId().equals(dto.getUserId()))
                throw new BadCredentialsException("Jwt token id and requested ids do not match");
            //handle the request
        }
    }
    

    现在,您的决策应该是aspect的一部分,您的业务逻辑进入控制器。

    希望这有帮助!!

  •  类似资料:
    • 我正在使用最新版本的JMeter,并试图从JMeter发出POST请求,但我无法看到更改HTTP方法的下拉列表。你能告诉我为什么我看不到下拉列表吗? 请在下面找到JMeter的屏幕截图。它没有用于指定HTTP方法的下拉列表。

    • 可以在模板中直接使用$Request对象,直接输入它的属性或调用它的大部分方法,但只支持方法的第一个参数; // 调用Request对象的get方法 传入参数为id {$Request.get.id} // 调用Request对象的param方法 传入参数为name {$Request.param.name} // 调用Request对象的param方法 传入参数为post.post_title

    • 可以在模板中直接使用$Request对象,直接输入它的属性或调用它的大部分方法,但只支持方法的第一个参数; // 调用Request对象的get方法 传入参数为id {$Request.get.id} // 调用Request对象的param方法 传入参数为name {$Request.param.name} // 调用Request对象的param方法 传入参数为post.post_title

    • 大家好,我是EJB组件技术的新手,为了准备我的学术讨论会考试,我必须学习这一点。我不确定我能理解生命周期的所有细节。 -客户机对EJB容器的请求(但该请求如何完成?请求的位置我指的是远程“EJB容器外部”还是本地“EJB容器内部”重要与否?) -根据请求,在池中创建一个bean实例并返回给客户机,在从客户机使用后,它再次返回池中(取决于bean类型(?))。 我认为这个场景适合于无状态会话bean

    • 客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须设置为“token”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推

    • 客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须被设置为“code”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推