我正在尝试获取一个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
答案 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
@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批注。确保其中存在,并且可能会起作用。
感谢所有回答!