不同的身份验证不同"接受"内容类型标题字段

时间:2017-03-10 14:24:20

标签: java spring rest spring-mvc spring-security

我有一个简单的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的两种不同身份验证机制如何?

1 个答案:

答案 0 :(得分:0)

在代码的可伸缩性和可维护性方面,这可能不是一个好的做法。

但是,这可能会对您有所帮助。但这指向两种类型登录的相同资源并提供相同的响应。在您的情况下,您希望为相同的资源提供不同的响应。这就是它不是一个好习惯的原因。 Combining basic authentication and form login for the same REST Api

另一种建议是在您的请求中添加可选属性,当您根据可选属性值在服务器端发出请求时,请调用适当的方法并根据需要设置响应内容类型。