我希望根据角色限制endpoint
的使用:管理员
/用户
。
因此,我试图使用NoopPasswordenCoder
实现Spring Security
(出于测试目的),但问题是:
所有endpoint返回status200
,并且对约束不响应为antmatchers
。
澄清一下:我想作为用户
登录,并因为antmatcher
而得到错误:
.antMatchers("/api/addresses")
.hasAuthority("ROLE_ADMIN")
我测试了Spring Security
配置的格式:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("admin","{noop}admin,ROLE_ADMIN,enabled");
users.put("user","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/addresses")
.access("hasAuthority('ROLE_ADMIN')")
.antMatchers("/api/address/**")
.access("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
基于示例配置。
在调查过程中,我试着发表评论,例如:
.antMatchers("/api/address/**")
.access("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("ADMIN","{noop}admin,ROLE_ADMIN,enabled");
users.put("USER","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/addresses")
.hasAuthority("ROLE_ADMIN")
.antMatchers("/api/address/**")
.hasAnyAuthority("ROLE_ADMIN", "ROLE_USER")
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
我尝试在Postman中清除cookies,以用户身份登录,但仍然得到200
。
只有当我不在Postman中使用GET
请求时,我才会获得401
:
UPD#2:
Java 11
spring-boot-starter-parent 2.5.3
spring-boot-starter-security 2.5.3
问题的原因是冗余配置选项:
server.servlet.context-path=/api
因为/api
前缀已经存在于.antmatchers()
中
server.servlet.context-path=/api
使用application.properties
解决方案3:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
final Properties users = new Properties();
users.put("admin","{noop}admin,ROLE_ADMIN,enabled");
users.put("user","{noop}user,ROLE_USER,enabled");
return new InMemoryUserDetailsManager(users);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.httpBasic()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@PreAuthorize("hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_USER')")
结果,我得到的是403
而不是200
:
我在Axios上使用Vue JS 2.5: 我想打一个像这样的电话: 我也尝试过不使用“axioconfig”参数。但每次它进入catch时,都会显示一条消息:Error:networkerror 在浏览器的网络选项卡中,我得到了200个状态和良好的响应(使用有效的json),它基本上可以工作,但Axios返回错误,没有响应。 控制台还输出以下警告: 我试着从邮递员那里打同样的电话,效果很好。不同
我试图通过spring boot学习Spring Security的基础知识,我创建了一个项目,其中还包括postgresql设置。Postgresql部分按预期工作。 问题是,在我通过正确的凭据访问安全endpoint后,我只是试图使用正确的用户名和错误的密码进行访问,并期待401错误,但返回200。并返回endpoint的内容。 如果我使用和进行基本身份验证请求,则响应为401 UnAutho
问题内容: 这真让我感到困惑。我收到来自Ajax的错误回调。但是,如果我从错误消息中获取res.responseText(返回正确,顺便说一句)并使用它,则它做对了。就像我收到了成功的回调一样。 数据设置如下: 和ajax调用是这样的: 错误消息是:发生错误:。 问题答案: 如果您的responseText不是正确的JSON,则会引发解析错误。无论是 确保你的反应是一个有效的JSON 或 删除。
我有一个名为Backend(端口:9090)的服务,位于Zuul(端口:8080)后面。 浏览器在Zuul上调用GET方法,执行重定向。 示例调用:http://localhost:8080/testredirect 结果: 浏览器收到Http状态=200 浏览器URL:http://localhost:8080/testredirect 浏览器显示:Hello world 预期结果: 浏览器应接
我有一个UIView,它通过几个约束被放置在屏幕上。一些约束由superview拥有,另一些约束由其他祖先拥有(例如,可能是UIViewController的view属性)。 要澄清这些解决方案的问题,请考虑以下视图层次结构: 爷爷 父亲 我 儿子 女儿 现在假设我们创建了以下约束,并始终将它们附加到它们最近的共同祖先: null
问题内容: 在Java中,人们将如何遍历约束an的线段?该仅由线的约束(但曲线的支持不会伤害)。 该方法应返回所有线段的集合。 问题答案: 这是可行的(我相信在所有情况下),但可能需要进行更彻底的测试: