gpt4 book ai didi

java - Spring security - 指定顺序时多个 httpsecurity 不起作用

转载 作者:行者123 更新时间:2023-12-02 01:04:41 24 4
gpt4 key购买 nike

我已按照以下说明为管理员和用户创建两个不同的 http 安全 block 。 docs.spring.io/spring-security-multiple-httpsecurity

如文档所述,如果 URL 不以/aaa 开头,则将使用另一个配置进行模式。

但是当我将@Order(1)放在管理 block 时,管理页面工作正常,用户页面不会重定向到登录页面/login/user

当我将@Order(1)放在用户 block 时,用户页面工作正常,管理页面也不会重定向到登录页面/login/admin。

这是我的java代码

@EnableWebSecurity
public class MultiHttpSecurityConfig {

/**
* intercept user url
*/
@Configuration
@Order(1)
public static class UserWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomAuthenticationSuccessHandler successHandler;

@Autowired
CustomAuthenticationFailureHandler failureHandler;

@Autowired
private CustomAuthenticationProvider customAuthProvider;

@Autowired
private CustomUserDetailsService userDetailsService;

@Value("${my.cookie.timeout}")
private int cookieTimeOut;


@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/css/**", "/js/**", "/images/**, /fonts/**").permitAll()
.antMatchers("/bbb/**","/aaaa/**").hasAnyRole("USER");
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage("/login/user").permitAll();
http.logout().permitAll();

http.rememberMe().key("uniqueAndSecret").tokenValiditySeconds(cookieTimeOut);
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(customAuthProvider);
auth.userDetailsService(userDetailsService);
}
}


/**
* intercept admin url
*/
@Configuration
public static class AdminWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomAuthenticationSuccessHandler successHandler;

@Autowired
CustomAuthenticationFailureHandler failureHandler;

@Value("${my.cookie.timeout}")
private int cookieTimeOut;

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/css/**", "/js/**", "/images/**, /fonts/**").permitAll()
.antMatchers("/ccc/**","/dddd").hasAnyRole("ADMIN");
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage("/login/admin").permitAll();
http.logout().permitAll();

http.rememberMe().key("uniqueAndSecret").tokenValiditySeconds(cookieTimeOut);
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("test").password("test").roles("ADMIN");
}
}
}

更新:

如下 dur 所说,关键原因是 authorizeRequests() 方法匹配了 Order(1) 中的所有 url,所以我需要添加 antMatcher("/bbb/*>")** 首先在authorizeRequests()之前。

但是antMatcher()只匹配一种url,如果我还有一种url要匹配,比如“/bbb/”,“/aaa/*”,如何实现这 ?那么我需要再添加一项 WebSecurityConfigurerAdapter 配置吗?有没有更好的方法来减少代码?

我在 spring-security SDK requestMatchers() 方法中找到了解决方案,它在 requestMatchers() 方法上方提供了一个示例。

下面是我的代码,用于在 Order(1) 上匹配用户的网址

http.csrf().disable();
http.requestMatchers()
.antMatchers("/bbb/**", "/aaa/**")
.and()
.authorizeRequests()
.antMatchers("/**").hasAnyRole("USER");
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage("/login/user").permitAll();
http.logout().permitAll();

那么bbb和aaa都已经匹配成功了,不需要再创建配置了

但是出现了另一个问题,当用户将用户名和密码发布到登录/用户界面时,它会显示“405方法不允许”登录页面,而管理页面工作正常

我搜索过google,它告诉我要禁用csrf,但我已经禁用了csrf...

最佳答案

在我的一个项目中,我没有使用表单登录,而是实现了自定义 AccessDeniedHandler 和 AuthenticationEntryPoint,它们可以使用我需要的一些自定义逻辑重定向到不同的登录页面。然而,loginPage()最终也是一个AuthenticationEntryPoint。

可以通过以下方式添加它们:

.exceptionHandling().authenticationEntryPoint(new YourCustomAuthEntryHandler()).and()
.exceptionHandling().accessDeniedHandler(new YourCustomAccessDeniedHandler())

这只是一个想法,也许值得检查一下。

此外,我认为您需要验证所有请求,请在authorizeRequests() block 中为这两个配置添加此行:

.anyRequest().authenticated()

关于java - Spring security - 指定顺序时多个 httpsecurity 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com