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

为什么`@preauthorize`不保护我的服务方法?

田镜
2023-03-14

我有一个用Java Spring MVC构建的web应用程序,并使用Spring Security进行登录。登录/退出工作很好。有两个用户角色“role_admin”和“role_user”。

我想确保我的方法userservice.createUser(username)只能由具有“role_admin”角色的用户访问。

我添加了@preauthorize批注,如下所示...

public class UserServiceImpl implements UserService {

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public Integer createUser(String username) throws Exception {
        /* .... */
    }

    /* ... */
}

共有1个答案

戎永福
2023-03-14

这个解决方案,多亏了@R.G提供的链接...

我将@EnableGlobalMethodSecurity(PrePostEnabled=True)添加到配置类中,如下所示...

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class AppConfig {
    /* ... */
}

然后我将@preauthorize添加到接口中的方法中,如下所示...

public interface UserService {

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public Integer createUser(String username) throws Exception;

}
 类似资料:
  • 我熟悉。正如我在spring文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中看到的,基于代理的概念。 在8.2.3.1支持的切入点指定器部分中,我发现了下面的注释 由于Spring的AOP框架的基于代理的性质,受保护的方法根据定义是不被拦截的,对于JDK代理(如果这不适用)和CGL

  • 问题内容: 这是受保护方法的文档: 我制作了这个小类来扩展scoreToSeq方法来自的类: 问题答案: (编辑:他们callmemorty的答案提供了在您的情况下避免该问题的实用建议。此答案提供了您为什么必须遵循该建议的原因,即,为什么语言是这样设计的。) 您只能访问与访问代码(或子类)具有相同类型的另一个对象的受保护成员,即使该成员是在超类型中 声明 的也是如此。 根据Java语言规范的第6.

  • 问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在

  • 我创建了一个包含一些基本crud方法的CrudController。这很好用。当我想保护这个控制器时,我可以重写超类中的方法,这很好。然而,我不想仅仅为了安全而重写每个方法。为此,我想在类上使用@Secured或@PreAuthorize。 我使用的是Spring Boot 2.2.2(最新版本)。 示例Crud基类 实现类 预期行为 当一个类被注释为@PreAuthorize或@安全时,我希望所

  • 当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?

  • 问题内容: 出于好奇, 为什么将方法的访问修饰符设置为。为什么不能呢?有人可以向我解释这背后的任何具体原因吗? 另外,我知道该方法仅被调用一次。如果我在程序内部两次调用它,会发生什么情况?垃圾收集器会再次调用吗? 问题答案: 我用另一个问题回答您的问题: 为什么方法不应该受到保护? 通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都 可以做。不能(因为派生类应该能够访问它