我如何使用permitAll允许公众访问Spring Security应用程序的某些部分?

时间:2019-06-07 00:16:51

标签: spring spring-boot spring-security

我正在尝试获取一个Spring应用程序,以允许一些请求公开(不登录),而另一些请求私有(登录)。

在这一点上,我只想让公共部分正常工作。

我已经尝试了Spring Security文档中列出的大多数示例配置,包括anonymous()和permitAll()的各种组合。所有这些最终都重定向到登录页面。

  protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
        .antMatchers("/resources/**", "/signup", "/about","/api/home").permitAll()                
            .antMatchers("/admin/**").hasRole("ADMIN")                                    
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")      
            .anyRequest().authenticated()                                             
            .and()
        // ...
        .formLogin();
    }

预期结果:无需登录即可访问allowAll()下的项目

实际结果:

  

重定向到登录页面。这显示在日志中:2019-06-06   17:29:43.593 INFO 56330 --- [主]   o.s.s.web.DefaultSecurityFilterChain:创建过滤器链:任意   请求,[org.sprin ...

这使我相信它甚至没有读取此配置。有什么办法可以解决这个问题?

谢谢!

更新:我尝试添加网络安全性忽略,但它似乎仍无法正常工作。它似乎仍会打印“ defaultsecuritychain”错误,因此我认为这可能与它有关。

更新2:在src / main / resources下添加了application.properties文件,其中这一行logging.level.org.springframework.security = DEBUG使其记录调试消息。

pastebin.com/2u9k7eHD

3 个答案:

答案 0 :(得分:0)

看看http://blog.florian-hopf.de/2017/08/spring-security.html,它可能会更详细地解释您的用例。

我的建议是尝试将WebSecurity用于静态和公共资源

public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/resources/**", "/signup", "/about","/api/home");
}

答案 1 :(得分:0)

您可以使用以下配置来满足您的要求。这是使用不需要在WebSecurity using ignoring instead of HttpSecurity as WebScurity will bypass the Spring Security Filter Chain and reduce the execution time

中放置身份验证/授权的URL的好方法
@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**", "/signup", "/about","/api/home");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")                                    
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") 
        .anyRequest().authenticated()
        .yourConfigurations
}

使用HttpSecurity并尝试permitAll()请求时。您的请求将被允许从Spring Security过滤链访问。这是昂贵的,因为还会有其他请求也要进入此过滤器链的请求,这些请求基于身份验证/授权需要被允许或不允许

但是,当您使用WebSecurity时,对"/resources/**", "/signup", "/about","/api/home"的任何请求都将完全通过Spring Security筛选器链。这是安全的,因为您无需进行任何身份验证/授权就可以查看图像或读取javascript文件。

答案 2 :(得分:-1)

结果是我一直在一个源文件中缺少@SpringBootApplication批注。确保其中存在,并且可能会起作用。

感谢所有回答!