首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Spring MVC (spring boot)配置为具有默认情况下被注释拒绝授权

如何将Spring MVC (spring boot)配置为具有默认情况下被注释拒绝授权
EN

Stack Overflow用户
提问于 2014-06-21 14:36:14
回答 2查看 1.3K关注 0票数 4

我希望我的Spring-HATEOAS API应用程序(构建于Spring-Boot和Spring-MVC之上)具有安全性配置,以便所有端点/控制器方法在默认情况下都被拒绝,并且只能通过方法注释显式授予访问权限。

我已经能够让注解控制所有的访问,但是如果开发人员忘记添加注解,匿名用户就可以访问该方法。我希望开发人员必须显式地注释(或执行一些其他显式开发操作)该方法,以便允许匿名访问。

也许我需要写一个自定义的AccessDecisionManager,但我认为怀疑默认情况下的拒绝行为是合理的……我只需要转动正确的旋钮。

我一直试图这样做,但都是徒劳的:

代码语言:javascript
复制
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http        
        .authorizeRequests()
        .anyRequest()
        .hasRole("NOONEHASIT")
        ;
    }
}

和一个控制器,比如:

代码语言:javascript
复制
@Controller
public class RootController {

    @RequestMapping("/")
    @PreAuthorize("hasRole('DEFAULT') or isAnonymous()")
    public HttpEntity<RootResource> root(){
        //stuff
    }
}

没有人有这个角色的想法,但这只是否认了每个人。

有人拿到魔法酱了吗?

EN

回答 2

Stack Overflow用户

发布于 2014-06-22 17:45:12

如果不显式地允许您想要注释的路径,我想不出有什么方法可以做到这一点。因此,您需要另一个具有较低Order的过滤器链(即另一个WebSecurityConfigurerAdapter),它显式地允许访问您需要保护的所有路径。你也许可以自动化,例如用@PreAuthorize查找@RequestMappings,但这会很麻烦,而且我不确定它是否值得。

注意:我不认为你需要在你的通用过滤器中有一个不存在的角色:你可以只使用denyAll()

票数 2
EN

Stack Overflow用户

发布于 2021-11-19 15:23:38

来自https://www.baeldung.com/spring-deny-access的解决方案

代码语言:javascript
复制
@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class DenyMethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
        return new CustomPermissionAllowedMethodSecurityMetadataSource();
    }
    ...
}
代码语言:javascript
复制
public class CustomPermissionAllowedMethodSecurityMetadataSource 
  extends AbstractFallbackMethodSecurityMetadataSource {
    @Override
    protected Collection findAttributes(Class<?> clazz) { return null; }

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

        // if the class is annotated as @Controller we should by default deny access to all methods
        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 getAllConfigAttributes() { return null; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24339048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档