gpt4 book ai didi

java - 如果缺少 @PreAuthorize 注释,则 Spring Security : Deny access to controller methods,

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:54 25 4
gpt4 key购买 nike

我有一个 Web 应用程序配置为以标准方式使用 Spring Security 3.2。

我正在使用 @PreAuthorize 注释来保护 Controllers 方法。现在,我想拒绝访问每个 Controller 方法除非它被注释为@PreAuthorize

我尝试了以下方法:

super Controller

每个 Controller 都从一个带有注释的 super Controller 扩展:@PreAutorize("denyAll")。这种方法似乎不起作用,因为 Controller 的方法注释被忽略了。一切都被禁止。

@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>

这种方法也失败了:仍然可以访问未注释的 Controller 方法。

最佳答案

我想出了一个类似的方法,但它不是针对每个请求都执行的,只是扩展了方法的 ConfigAttribute:

一个小缺点可能是它不允许简单的日志记录,或者最大的好处是它遵循与其他不允许的端点相同的拒绝行为。

安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

@Override
protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
return new CustomPermissionAllowedMethodSecurityMetadataSource();
}
}

元数据源:

public class CustomPermissionAllowedMethodSecurityMetadataSource extends AbstractFallbackMethodSecurityMetadataSource {
@Override
protected Collection<ConfigAttribute> findAttributes(Class<?> clazz) {
return null;
}

@Override
protected Collection<ConfigAttribute> findAttributes(Method method, Class<?> targetClass) {
Annotation[] annotations = AnnotationUtils.getAnnotations(method);
List<ConfigAttribute> attributes = new ArrayList<>();

// if the class itself is annotated as a @Controller we should by default deny access to every method
if (AnnotationUtils.findAnnotation(targetClass, Controller.class) != null) {
attributes.add(DENY_ALL_ATTRIBUTE);
}

if (annotations != null) {
for (Annotation a : annotations) {
// but not if the method has at least a PreAuthorize or PostAuthorize annotation
if (a instanceof PreAuthorize || a instanceof PostAuthorize) {
return null;
}
}
}
return attributes;
}

@Override
public Collection<ConfigAttribute> getAllConfigAttributes() {
return null;
}
}

我还写了一篇关于这个的小文章,有一些进一步的背景:https://www.baeldung.com/spring-deny-access

关于java - 如果缺少 @PreAuthorize 注释,则 Spring Security : Deny access to controller methods,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30348839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com