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

在使用PreAuthorize时,自动安装的服务在响应体方法中为空

方浩旷
2023-03-14

我有一个“Foo”控制器,它正在自动装配“Foo”服务。

现在,当我向控制器添加PreAuthorize注释时,视图方法工作正常,PreAuthorize标记仅授予具有ADMIN权限的用户访问权限,但响应体方法(getFoo)不能按预期工作。

使用PreAuthorize注释时,getFoo方法无法正确自动装配/实例化foService对象,该对象的值为null,导致NPE(空指针异常)。

问题概述:当AJAX GET请求调用getFoo方法时,fooService为null(导致NPE)。

然而,当注释掉@PreAuthorize时,调用getFoo时,fooService不再为null。

...

这是代码:

Foo控制器

@Controller
@RequestMapping("/foo")
@PreAuthorize("hasAuthority(T(com.foo.security.Authorities).ADMIN)")
public class FooController {

    @Autowired
    private FooService fooService;

    @RequestMapping(value = "/view") 
    public String view(@AuthenticationPrincipal Principal principal) {
        return "view";
    }

    @RequestMapping(value = "/getFoo")
    @ResponseBody
    public Foo getFoo() {
        fooService.getFoo(); <- NPE happens here
    }
}

Foo服务

@Service("fooService")
public class FooServiceImpl implements FooService {

    @Autowired
    FooRepository fooDao;

    @Override
    public Foo getFoo() {
        return fooDao.getFoo();
    }
}

安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }

共有2个答案

呼延钱明
2023-03-14

调用服务的线程似乎没有正确的安全角色。

尝试移动@PreAuthorize注释以仅保护view方法

同样根据您的评论,我发现您的问题可能是使用了两个不同的bean实例。检查是否未在上下文文件中复制定义。

公良弘毅
2023-03-14

确保所有带有RequestMapping注释的控制器方法未声明为私有

 类似资料:
  • 我有一个spring boot应用程序,其中自动连接的服务突然在特定的方法中返回null。 以下是控制器的代码段: < code>userService在第一个方法中为null,在第二个方法中运行良好。 更新:这是用户服务的代码片段,在“寄存器”方法中为空。 具有正常的CRUD方法。请注意,userService为null,因此当我调用其任何方法时都会抛出NullPointerException。

  • 我有一个用Java Spring MVC构建的web应用程序,并使用Spring Security进行登录。登录/退出工作很好。有两个用户角色“role_admin”和“role_user”。 我想确保我的方法只能由具有“role_admin”角色的用户访问。 我添加了批注,如下所示...

  • 我有一个用vert编写的双垂直服务器。x反应性扩展。HTTP server verticle使用事件总线向DB verticle发送请求。从DB verticle(通过事件总线)接收到响应后,我使用rxEnd将响应发送到http客户端。然而,客户似乎没有收到这种回复,最终超时。如果我用end()来代替,事情会很顺利。我使用postman来测试这个RESTAPI。请参阅下面的代码,该代码将结果从数据

  • 这可能是一个奇怪的问题,尽管我想知道为什么以前没有人提出过这个问题。。。因此,如果有任何无知,请纠正我。 首先,我将Jackson与Spring和@ResponseBody注释结合使用。目前,对于每个请求处理程序,我都返回一个“Response”包装器对象,这是客户机所期望的。这个包装非常简单: 问题是,我不喜欢显式地包装所有请求处理程序的每个返回值。我也不喜欢在单元测试中打开这些响应包装。 相反

  • 安装应用程序时间线服务器时出错。请找出以下错误。 标准: 回溯(最近一次呼叫最后一次): 文件“/var/lib/ambari agent/cache/common services/warn/2.1.0.2.0/package/scripts/application\u timeline\u server.py”,第89行,在 执行 文件“/usr/lib/ambari agent/lib/re

  • 问题内容: 我正在阅读Pro Spring3这本书。它有一段确实让我感到困惑。该段是关于春季自动装配的。这是节选: 在大多数情况下,是否应该使用自动装配的问题的答案肯定是“不!”。自动装配可以在小型应用程序中节省时间,但在许多情况下,这会导致不良做法,并且在大型应用程序中不灵活。使用byName似乎是个好主意,但它可能会导致您为类提供人为的属性名称,以便可以利用自动装配功能。Spring的整个想法