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

Spring Security:如果缺少@PreAuthorize注释,则拒绝对控制器方法的访问

农弘毅
2023-03-14
@PreAutorize("denyAll") 
public class SuperController {

}

public class MyController extends SuperController {

    @PreAuthorize("hasRole('SUPERHERO')")
    @RequestMapping(value = URL_PREFIX + "Add.do", method =  RequestMethod.GET)
    public String doStuff(Model model) {

        ...
    }

}

在全局方法安全标记中使用切入点表达式

<global-method-security pre-post-annotations="enabled">
    <protect-pointcut expression="execution(* com.acme.*Controller.*(..))" access="denyAll" />
 </global-method-security>

这种方法也失败了:控制器的方法没有注释仍然可以访问。

共有1个答案

潘兴朝
2023-03-14

我在这里回答我自己的问题。

我通过使用HandlerInterceptorAdapter解决了这个问题。

我不确定这是实现结果的最典型的方法,但对我来说已经足够好了。

public class MvcPreAuthorizeAnnotationCheckerInterceptor extends HandlerInterceptorAdapter {
    final HandlerMethod hm;
    if (handler instanceof HandlerMethod) {
        hm = (HandlerMethod) handler;
        PreAuthorize annotation = hm.getMethodAnnotation(PreAuthorize.class);
        if (annotation == null) {
            // check if the class is annotated...
            annotation = hm.getMethod().getDeclaringClass().getAnnotation(PreAuthorize.class);
            if (annotation == null) {
                // add logging
                // or send a NON AUTHORIZED
                response.sendRedirect(request.getContextPath());
            }
       }
       return true;
    }
}
<mvc:interceptors>
    <beans:ref bean="mvcPreAuthorizeAnnotationCheckerInterceptor"/>
</mvc:interceptors>

<beans:bean id="mvcPreAuthorizeAnnotationCheckerInterceptor" class="com.acme.MvcPreAuthorizeAnnotationCheckerInterceptor"/>
 类似资料:
  • 大多数Web应用程序在使用户可以访问该功能之前验证功能级别访问权限。但是,如果未在服务器上执行相同的访问控制检查,则黑客无法在未经适当授权的情况下进入应用程序。 我们将通过以下每项来了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 具有网络访问权限的任何人都可以向应用程序发送请求。 攻击者的方法 - 谁是授权系统用户,只需将URL或参数更改为特权函数即可。 安全弱点

  • 问题内容: 为什么无法从另一个内部访问其他控制器方法呢? 像这样。 已编译 如果您不能这样做,那为什么不呢?我还应该怎么做… 问题答案: 最近几个小时遇到相同的问题。我使用了api / services文件夹。它可能不完全是您所需要的,但是它是一个选择。

  • 我们已经使用Spring security来保护restendpoint。每个rest资源都使用@preauthorize注释进行注释。当调用方没有访问他为Spring security请求的资源的权限时,会抛出一个org.springFramework.security.access.AccessDeniedException异常。我们有一个异常映射器,它将这个带有适当错误代码403的消息返回给

  • 我正在研究Dispatcher Servlet代码。在这里,我发现调度程序servlet使用HandlerMap来选择请求的处理程序。此外,Request estMappingHandlerMap用作HandlerMap的实现。现在,如果考虑的bean具有@Controller或@Request estMap注释,则isHandlerMethod of Request estMappingHand

  • 我有一个简单的Spring Boot应用程序,它公开了一个RESTAPI。我已经使用@PreAuthorize(“hasRole('ROLE_4'))注释成功地配置了Spring Security性,以根据restapi中的角色保护每个方法。 我注意到,如果我根本不把@PreAuthorize注释,框架允许任何经过身份验证的用户进行此请求。我想扭转这种行为。因此,如果其中一个程序员忘记添加@Pre

  • 我的控制器类如下: 我有以下资源服务器配置 最后,我的测试如下所示: 问题是我总是获得401 HTTP状态,并显示消息“unauthorized”,“error\u description”:“访问此资源需要完全身份验证”。 我应该如何为@PreAuthorated注释控制器方法方法编写测试?