我正在尝试在我的项目中实现jdbcAuthentication
。问题是,当我从browser
发出请求时它会起作用,但是当我从Postman
发出请求时它不起作用,我的意思是认证不会发生,甚至随机凭证也能正常工作。
但是,如果我使用inMemoryAuthentication
,它适用于浏览器和邮递员。这是我在SecurityConfig
内的代码。
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("select username,password, enabled from users where username=?")
.authoritiesByUsernameQuery("select username, role from user_roles where username=?");
// This works --> auth.inMemoryAuthentication().withUser("user").password("pass").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests().anyRequest().authenticated().and().httpBasic().and().csrf().disable();
}
在邮递员中,我发出了POST
请求。
在Authorization
类型中,我选择基本身份验证并输入凭据,然后在下面的授权标题中填充
这些是标题
Content-Type:application/json
X-XSRF-TOKEN:{{X-CSRF-TOKEN}}
Authorization:Basic ajhsjajywshhshshsssss
如果我评论jdbcAUthentication
部分并取消注释inMomeryAuthentication
代码,则身份验证可以同时使用broswer和postman。有人可以帮助我,为什么会这样?我错过了什么吗?谢谢!!
答案 0 :(得分:0)
您正在使用.authenticated()
,这意味着用户已经过身份验证,并且您希望允许已经过身份验证的用户(又名"记住")。
http.authorizeRequests().anyRequest()
.authenticated().and().httpBasic().and().csrf().disable();
但实际上,您要做的是第一次进行身份验证,因此您需要将其更改为fullyAuthenticated
http.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and().httpBasic()
.and().csrf().disable();
如果您查看 AuthorizedUrl 文档,则会发现:
authenticated():指定任何经过身份验证的用户都允许使用这些网址。
<强> fullyAuthenticated()强>: 指定经过身份验证但未被记住的用户允许使用这些网址。