Spring Security,安全且无安全访问

时间:2016-08-20 09:17:15

标签: java spring security spring-security

我正在做一个需要先登录的小应用程序。但对于某些第三方工具,我想提供一个不需要登录的API。登录本身工作正常,API本身有效,但我无法弄清楚如何告诉Spring Security,无需身份验证即可访问API。我在这里和其他网站上检查了几个主题并尝试了不同的版本,但都没有。每次我尝试访问API时,都会转发到登录表单并且必须先登录。

我的代码到目前为止,在我的Spring Security配置中看起来像这样:

/**
 * configuration of spring security, defining access to the website
 * 
 * @param http
 * @throws Exception 
 */
@Override
protected void configure(HttpSecurity http) throws Exception {        
    http.authorizeRequests()                
            .antMatchers("/rest/open**").permitAll()
            .antMatchers("/login**").permitAll()
            .and()
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .defaultSuccessUrl("/dashboard")
            .loginProcessingUrl("/j_spring_security_check")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutUrl("/j_spring_security_logout")
            .logoutSuccessUrl("/login?logout")
            .and()
        .csrf();
}

我的控制员:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PredictionOpenRestController {

    @RequestMapping("/rest/open/prediction")
    public String getPrediction() {
        return "First Try!";
    }
}

不知怎的,我不得不想念一些东西。

1 个答案:

答案 0 :(得分:1)

请参阅Spring Security Reference

  

我们的示例仅要求用户进行身份验证,并且已针对应用程序中的每个URL进行了身份验证。我们可以通过向http.authorizeRequests()方法添加多个子项来指定网址的自定义要求。例如:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()                                                                
            .antMatchers("/resources/**", "/signup", "/about").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")  
            .anyRequest().authenticated()
            .and()
        // ...
        .formLogin();
}
     

1 http.authorizeRequests()方法有多个子节点,每个匹配器按照它们被声明的顺序被考虑。

     

2   我们指定了任何用户都可以访问的多种URL模式。具体来说,如果URL以“/ resources /”开头,等于“/ signup”或等于“/ about”,任何用户都可以访问请求。

     

3   任何以“/ admin /”开头的URL都将被重新命名为具有“ROLE_ADMIN”角色的用户。您会注意到,由于我们正在调用hasRole方法,因此我们不需要指定“ROLE_”前缀。

     

4   任何以“/ db /”开头的URL都要求用户同时拥有“ROLE_ADMIN”和“ROLE_DBA”。您会注意到,由于我们使用的是hasRole表达式,因此我们不需要指定“ROLE_”前缀。

     

5   任何尚未匹配的URL只需要对用户进行身份验证

第二次使用.authorizeRequests()会覆盖第一个。

另见AntPathMatcher

  

映射使用以下规则匹配URL:

     

?匹配一个字符

     

*匹配零个或多个字符

     

**匹配路径中的零个或多个目录

     

实施例

     

com/t?st.jsp - 匹配com/test.jsp,但com/tast.jspcom/txst.jsp

     

com/*.jsp - 匹配.jsp目录

中的所有com个文件      

com/**/test.jsp - 匹配test.jsp路径下的所有com个文件

     

org/springframework/**/*.jsp - 匹配.jsp路径下的所有org/springframework个文件

     

org/**/servlet/bla.jsp - 匹配org/springframework/servlet/bla.jsp,但org/springframework/testing/servlet/bla.jsporg/servlet/bla.jsp

您修改过的代码:

protected void configure(HttpSecurity http) throws Exception {        
    http.authorizeRequests()                
            .antMatchers("/rest/open/**").permitAll()
            .antMatchers("/login/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .defaultSuccessUrl("/dashboard")
            .loginProcessingUrl("/j_spring_security_check")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutUrl("/j_spring_security_logout")
            .logoutSuccessUrl("/login?logout")
            .and()
        .csrf();
}