Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建MQ侦听器和spring引导应用程序,并在所有类中实现身份验证?_Java_Spring_Spring Boot_Spring Security_Spring Rabbit - Fatal编程技术网

Java 如何创建MQ侦听器和spring引导应用程序,并在所有类中实现身份验证?

Java 如何创建MQ侦听器和spring引导应用程序,并在所有类中实现身份验证?,java,spring,spring-boot,spring-security,spring-rabbit,Java,Spring,Spring Boot,Spring Security,Spring Rabbit,我有一个应用程序,配置为通过JWT令牌对用户进行身份验证,通过特殊的令牌转换器解析用户的角色和其他授权参数。此应用程序通过转发传入的用户身份验证数据执行到其他服务的即席请求 但是,有些应用程序通过消息队列(具体是rabbitmq)将信息分发给我的应用程序。为此实现了一个侦听器,它应该从队列中读取消息,并通过service/repo将其插入到我的应用程序数据库中。服务和repo受到各种@PreAuthorize注释的保护,其中实现了不同的访问逻辑 我的问题是,从我的侦听器中绕过此安全配置的最佳方法

我有一个应用程序,配置为通过JWT令牌对用户进行身份验证,通过特殊的令牌转换器解析用户的角色和其他授权参数。此应用程序通过转发传入的用户身份验证数据执行到其他服务的即席请求

但是,有些应用程序通过消息队列(具体是rabbitmq)将信息分发给我的应用程序。为此实现了一个侦听器,它应该从队列中读取消息,并通过service/repo将其插入到我的应用程序数据库中。服务和repo受到各种@PreAuthorize注释的保护,其中实现了不同的访问逻辑

我的问题是,从我的侦听器中绕过此安全配置的最佳方法是什么,因为我保证所有消息都是有效的,并且必须在没有任何授权的情况下立即进行消化

我认为: 使用SecurityContextHolder手动验证并注销虚拟用户。我创建了一个简单的方法:

    public void login() {
        Set<GrantedAuthority> authorities = new HashSet<>();
        authorities.add(new SimpleGrantedAuthority(String.format("ROLE_%s", serviceUser.getRole().name())));

        UserAuthenticationToken userAuthentication = new UserAuthenticationToken(serviceUser, authorities);
        SecurityContext scurityContext = SecurityContextHolder.createEmptyContext();
        scurityContext.setAuthentication(userAuthentication);
        SecurityContextHolder.setContext(scurityContext);
    }

    public void logout() {
        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(null);
        SecurityContextHolder.clearContext();
    }
public void login(){
Set authorities=new HashSet();
添加(新的SimpleGrantedAuthority(String.format(“角色%s”,serviceUser.getRole().name()));
UserAuthenticationToken userAuthentication=新的UserAuthenticationToken(服务用户、权限);
SecurityContext scurityContext=SecurityContextHolder.createEmptyContext();
scurityContext.setAuthentication(userAuthentication);
setContext(scurityContext);
}
公开作废注销(){
SecurityContext上下文=SecurityContextHolder.getContext();
setAuthentication(null);
SecurityContextHolder.clearContext();
}
这不起作用,因为我的侦听器缺少RequestContext(我不确定这是否是一个正确的单词),并且出现以下错误:

java.lang.IllegalStateException:未找到线程绑定请求:您是指实际web请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上在web请求中操作,并且仍然收到此消息,那么您的代码可能在DispatcherServlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求

在这个问题上,我没有考虑将我的侦听器移出应用程序。我正在寻找设置RequestContext并仍然使用我的登录/注销方法的选项,或者另一种验证用户身份并同时创建上下文的方法

谢谢