Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring security-指定订单时多个httpsecurity不起作用_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java Spring security-指定订单时多个httpsecurity不起作用

Java Spring security-指定订单时多个httpsecurity不起作用,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我按照下面的说明为管理员和用户创建了两个不同的http安全块。 如文档所述,如果URL不是以/aaa开头,则将使用另一个配置来创建该模式 但当我在admin块下@Order(1)时,admin页面工作正常,用户页面不会重定向到login页面/login/user 当我在用户块中放置@Order(1)时,用户页面工作正常,管理员页面也不会重定向到login page/login/admin 这是我的java代码 @EnableWebSecurity 公共类MultiHttpSecurityCon

我按照下面的说明为管理员和用户创建了两个不同的http安全块。

如文档所述,如果URL不是以/aaa开头,则将使用另一个配置来创建该模式

但当我在admin块下@Order(1)时,admin页面工作正常,用户页面不会重定向到login页面/login/user

当我在用户块中放置@Order(1)时,用户页面工作正常,管理员页面也不会重定向到login page/login/admin

这是我的java代码

@EnableWebSecurity
公共类MultiHttpSecurityConfig{
/**
*拦截用户url
*/
@配置
@订单(1)
公共静态类UserWebSecurityConfig扩展了WebSecurityConfigureAdapter{
@自动连线
CustomAuthenticationSuccessHandler successHandler;
@自动连线
CustomAuthenticationFailureHandler failureHandler;
@自动连线
私有CustomAuthenticationProvider customAuthProvider;
@自动连线
私有customuserdetails服务userdetails服务;
@值(“${my.cookie.timeout}”)
私人内部cookieTimeOut;
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.csrf().disable();
http.authorizeRequests()
.antMatchers(“/css/**”,“/js/**”,“/images/**,/font/**”).permitAll()
.antMatchers(“/bbb/**,”/aaaa/**”).hasAnyRole(“用户”);
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage(“/login/user”).permitAll();
http.logout().permitAll();
http.rememberMe().key(“uniqueAndSecret”).tokenValiditySeconds(cookieTimeOut);
}
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
auth.authenticationProvider(customAuthProvider);
auth.userDetailsService(userDetailsService);
}
}
/**
*拦截管理员url
*/
@配置
公共静态类AdminWebSecurityConfig扩展了WebSecurityConfigureAdapter{
@自动连线
CustomAuthenticationSuccessHandler successHandler;
@自动连线
CustomAuthenticationFailureHandler failureHandler;
@值(“${my.cookie.timeout}”)
私人内部cookieTimeOut;
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.csrf().disable();
http.authorizeRequests()
.antMatchers(“/css/**”,“/js/**”,“/images/**,/font/**”).permitAll()
.antMatchers(“/ccc/**,”/dddd”)。具有任何角色(“管理员”);
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage(“/login/admin”).permitAll();
http.logout().permitAll();
http.rememberMe().key(“uniqueAndSecret”).tokenValiditySeconds(cookieTimeOut);
}
@自动连线
public void configureGlobal(AuthenticationManagerBuilder auth)引发异常{
auth.inMemoryAuthentication()
.withUser(“test”)。密码(“test”)。角色(“ADMIN”);
}
}
}
更新: 正如dur在下面所说的,关键原因是authorizeRequests()方法按顺序(1)匹配所有URL,因此我需要在authorizeRequests()之前首先添加antMatcher(“/bbb/*”)

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

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

下面是我在订单(1)中匹配用户URL的代码

http.csrf().disable();
http.requestMatchers()
.antMatchers(“/bbb/**”和“/aaa/**”)
.及()
.授权请求()
.antMatchers(“/**”).hasAnyRole(“用户”);
http.formLogin()
.successHandler(successHandler)
.failureHandler(failureHandler)
.loginPage(“/login/user”).permitAll();
http.logout().permitAll();
那么bbb和aaa都已匹配,不需要创建其他配置

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


我搜索过谷歌,它告诉我要禁用csrf,但我已经禁用了csrf…

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

可通过以下方式添加:

.exceptionHandling().authenticationEntryPoint(new YourCustomAuthEntryHandler()).and()
.exceptionHandling().accessDeniedHandler(new YourCustomAccessDeniedHandler())
这只是一个想法,也许值得检查一下

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


现在想想,你实际上可以有一个安全配置:在auth entry handler中检查请求url(如果有来自管理站点的url),你可以将其重定向到admin login,但是这不是最好的解决方案,但应该可以工作。非常感谢你的回复,我会考虑使用它:两个配置都适用于<代码> /**/COD>(任何请求),所以使用第一个配置。如果添加订单,则使用订单最低的订单。
.anyRequest().authenticated()