我在Spring Security中使用Spring boot 1.3.2。 我有以下配置(HttpSecurity http)方法来强制进行身份验证
protected void configure(HttpSecurity http) throws Exception {
RequestMatcher csrfRequestMatcher = new RequestMatcher() {
private AntPathRequestMatcher[] requestMatchers = {
new AntPathRequestMatcher("/iams/w/*")
};
@Override
public boolean matches(HttpServletRequest request) {
for (AntPathRequestMatcher rm : requestMatchers) {
if (rm.matches(request)) { return true; }
}
return false;
} // method matches
};
http
.csrf()
.requireCsrfProtectionMatcher(csrfRequestMatcher)
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.and()
.httpBasic();
}
我有以下配置(WebSecurity web)方法忽略下面的一些网址;
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(
"/myapp/docs/**",
"/myapp/docs/*",
"/myapp/docs/index.html",
"/resources/**",
"/static/**");
}
但http://127.0.0.1:9000/myapp/docs/index.html的http请求仍然需要用户名/密码(身份验证)并返回"状态":401,"错误":"未授权" ... 实际上WebSecurity上的忽略url都没有工作,因为它还需要身份验证。如果我提供auth然后它工作。我怎么能在这里简单地忽略一些网址(例如" / myapp / docs / **")。我在SecurityConfig类中有以下定义
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) 公共类SecurityConfig扩展了WebSecurityConfigurerAdapter {
我错过了什么?请告知。
答案 0 :(得分:0)
您的代码中存在错误顺序。
http
.csrf()
.requireCsrfProtectionMatcher(csrfRequestMatcher)
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.and()
.httpBasic();
因此,需要对任何请求进行身份验证。您可以直接使用antMatchers
。
http
.authorizeRequests()
.antMatchers("/iams/w/*")
.authenticated()
.and()
.httpBasic()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.csrf().disable()
我希望它对你有所帮助。
答案 1 :(得分:0)
感谢您的回复,但有您的建议,我的" / iams / w / *"完全没有受到保护。我可以找到所有这些网址; " /艾姆斯/文档/ **" ," / iams / w / "和" / iams / api / "没有基本的认证。以下是根据您的建议设置。在这里,我想保护" / iams / w"和" / iams / api /"使用用户名/密码,但让每个人都可以访问" / iams / docs / *"没有用户名/密码。这是基于spring boot restful的实现,但是希望公开一些像docs这样的url,以便所有人都能访问它而不是api调用。
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(
"/iams/docs/**",
"/iams/docs/*",
"/iams/docs/index.html",
"/static/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/iams/api/**","/iams/api/v1/*")
.authenticated()
.and()
.httpBasic()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.and()
.csrf().disable();
}
答案 2 :(得分:0)
可能更容易使用尽可能简单的一组模式来保护不安全,然后简单地说其他一切都是安全的。
这可能更接近你想要的东西:
public static final String[] NOT_SECURED = {"/iams/docs/**","/static/**"};
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(NOT_SECURED);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(NOT_SECURED).permitAll()
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.and()
.csrf().disable();
}