我正在使用无状态弹簧安全性,但是在注册的情况下我想禁用spring security.I禁用
setImmediate
但它不起作用,我收到以下错误:
process.nextTick
我认为这意味着Spring安全过滤器正在运行
我的网址订单总是" / api / v1"
我的春季配置是
antMatchers("/api/v1/signup").permitAll().
我的身份验证过滤器是
message=An Authentication object was not found in the SecurityContext, type=org.springframework.security.authentication.AuthenticationCredentialsNotFoundException
我的控制器是
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().
authorizeRequests().
antMatchers("/api/v1/signup").permitAll().
anyRequest().authenticated().
and().
anonymous().disable();
http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);
}
我是春天新手,请帮我怎么做?
答案 0 :(得分:99)
使用permitAll
时,它表示每个经过身份验证的用户,但是您禁用了匿名访问权限,因此无法使用。
您想要忽略某些网址,以覆盖采用configure
对象和WebSecurity
模式的ignore
方法。
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/api/v1/signup");
}
从HttpSecurity
部分删除该行。这将告诉Spring Security忽略此URL并且不对它们应用任何过滤器。
答案 1 :(得分:12)
我有更好的方法:
http
.authorizeRequests()
.antMatchers("/api/v1/signup/**").permitAll()
.anyRequest().authenticated()
答案 2 :(得分:8)
<http pattern="/resources/**" security="none"/>
或者使用Java配置:
web.ignoring().antMatchers("/resources/**");
而不是旧的:
<intercept-url pattern="/resources/**" filters="none"/>
表示exp。禁用登录页面的安全性:
<intercept-url pattern="/login*" filters="none" />
答案 3 :(得分:5)
这可能不是您问题的完整答案,但是如果您正在寻找禁用csrf保护的方法,您可以这样做:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/web/admin/**").hasAnyRole(ADMIN.toString(), GUEST.toString())
.anyRequest().permitAll()
.and()
.formLogin().loginPage("/web/login").permitAll()
.and()
.csrf().ignoringAntMatchers("/contact-email")
.and()
.logout().logoutUrl("/web/logout").logoutSuccessUrl("/web/").permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("admin").roles(ADMIN.toString())
.and()
.withUser("guest").password("guest").roles(GUEST.toString());
}
}
我已包含完整配置,但关键行是:
.csrf().ignoringAntMatchers("/contact-email")
答案 4 :(得分:2)
如果要忽略多个API端点,可以按以下方式使用:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().disable().authorizeRequests()
.antMatchers("/api/v1/**").authenticated()
.antMatchers("api/v1/authenticate**").permitAll()
.antMatchers("**").permitAll()
.and().exceptionHandling().and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
答案 5 :(得分:0)
@ M.Deinum已经写下了答案。
我尝试使用api /api/v1/signup
。它将绕过过滤器/自定义过滤器,但浏览器会为/favicon.ico
调用一个附加请求,因此,我也在web.ignoring()中添加了它,并且对我有用。
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/api/v1/signup", "/favicon.ico");
}
也许上述问题不是必需的。
答案 6 :(得分:0)
我遇到了同样的问题,这是解决方案:(已解释)
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(HttpMethod.POST,"/form").hasRole("ADMIN") // Specific api method request based on role.
.antMatchers("/home","/basic").permitAll() // permited urls to guest users(without login).
.anyRequest().authenticated()
.and()
.formLogin() // not specified form page to use default login page of spring security.
.permitAll()
.and()
.logout().deleteCookies("JSESSIONID") // delete memory of browser after logout.
.and()
.rememberMe().key("uniqueAndSecret"); // remember me check box enabled.
http.csrf().disable(); **// ADD THIS CODE TO DISABLE CSRF IN PROJECT.**
}