我有一个简单的Web应用程序,它使用默认的Spring Security表单身份验证,并且一旦通过身份验证,就允许用户在Thymeleaf视图和访问内容之间进行浏览。
我能够为同一个端点提供REST客户端应用程序的JSON而不是Web视图,只需使用这样的Spring映射:
// response for web application, thymeleaf views
@RequestMapping("/fruits", produces = MediaType.TEXT_HTML_VALUE)
public String index(Model model) {
model.addAttribute("fruits", fruits);
return "fruitsView";
}
// response for REST client applications
@RequestMapping("/fruits", produces = MediaType.APPLICATION_JSON_VALUE)
public Fruits[] index() {
return fruits;
}
问题是:当请求接受JSON(接受标题字段)而不是首先接受HTML时,是否可以接受基本身份验证而不是使用登录Web表单进行响应?
我的安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// works well for web views:
http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin();
// works well for REST clients:
// http.authorizeRequests().antMatchers("/**").hasRole("USER").and().httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
}
}
是否可以按照每个响应特定 Accept 内容类型标题字段的方式配置 httpBasic 和 formLogin 身份验证?< / p>
我们了解到,可以针对不同的网址格式进行两种不同的身份验证:Spring REST security - Secure different URLs differently。但是,通过接受内容标题字段区分请求的同一URL的两种不同身份验证机制如何?
答案 0 :(得分:0)
在代码的可伸缩性和可维护性方面,这可能不是一个好的做法。
但是,这可能会对您有所帮助。但这指向两种类型登录的相同资源并提供相同的响应。在您的情况下,您希望为相同的资源提供不同的响应。这就是它不是一个好习惯的原因。 Combining basic authentication and form login for the same REST Api
另一种建议是在您的请求中添加可选属性,当您根据可选属性值在服务器端发出请求时,请调用适当的方法并根据需要设置响应内容类型。