Spring Security permitAll()用于某种模式下的一个URL

时间:2016-12-30 13:41:34

标签: spring spring-security http-basic-authentication

我有/ my-app /登录网址,我想要这个网址的permitAll()。但是/ my-app / **模式下的这个页面只允许注册用户访问。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http

                .csrf().disable()
                .authorizeRequests()
                    .antMatchers("/my-app/**").access("hasRole('USER')")
                    .and()
                .httpBasic()
                .authenticationEntryPoint(entryPoint());
    }

怎么做?

1 个答案:

答案 0 :(得分:0)

.antMatchers("/my-app/login").permitAll()之前添加.antMatchers("/my-app/**")...。请求匹配器存储在列表中(按定义它们的顺序排序),Spring安全性将使用匹配当前请求的第一个规则。因此,最后列出最具体的第一条和通用规则。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http

            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/my-app/login").permitAll()
                .antMatchers("/my-app/**").access("hasRole('USER')")
                .and()
            .httpBasic()
            .authenticationEntryPoint(entryPoint());
}

如果my-app是您的应用程序的名称,因此应用程序服务器(Tomcat)将URL映射到应用程序的URL,那么您必须在{{{{}}中省略它1}}因为antMatcher由应用程序相对网址“仅”配置:antMatcher变为/my-app/login/login变为/my-app/**

添加/**作为.anyRequest().permitAll()的最后一个“匹配器”

authorizeRequests()

但说实话:你使用某种黑名单(允许除了一些黑名单之外的所有网址) - 这不是推荐的方式(从某些安全角度来看)。因为如果您忘记添加或拼错一个应该受到保护的URL,那么每个正文都可以访问它。更安全的方法是拒绝每个网址并仅允许一些(白名单)。