在spring security中提供静态资源 - 允许访问'/ resources / public'中的所有文件

时间:2018-03-28 14:35:58

标签: java spring-security static-resource

我可以使用此设置完美地提供静态资源,但是我必须逐个文件地定义允许提供的文件。

我当前的用例是/resources/public/目录中应该允许客户端访问的任何内容。

我尝试了一个仍然不允许访问所有公共资源/resources/public/**/public/**的{​​{1}}和/resources/public/。所以在我的http配置中,我开始定义允许的文件扩展名,但我不喜欢这种方法,因为我的webapp中有很多不同的扩展名。

我的问题是如何允许访问WebSecurityConfigurerAdapter中的所有文件,而无需为每个文件扩展名定义蚂蚁匹配器,或者我只是小费?

Spring @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers("/resources/**"); } @Override protected void configure(HttpSecurity http) { http .authorizeRequests() .authorizeRequests() .antMatchers( "/public/**", "/.svg", "/.ico", "/.eot", "/.woff2", "/.ttf", "/.woff", "/.html", "/.js", "/.map", "/*.bundle.*", "/index.html", "/", "/home", "/dashboard") .permitAll() .anyRequest().authenticated(); } - 根据jmw5598的回答编辑。

@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@Controller
public class AngularWebAppController {

    @GetMapping(value = "/{path:[^\\.]*}")
    public String redirect() {
        return "forward:/";
    }

}

用于投放网络应用的控制器:

/resources

eclipse

中的我的目录结构

enter image description here

  • 根据dur的评论添加。 enter image description here

1 个答案:

答案 0 :(得分:2)

您想要请求分隔符资源或URL处理程序映射。这在春天很容易。

<强> Servelet的上下文

<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
    up static resources in the ${webappRoot}/resources directory -->

<resources mapping="/resources/**" location="/resources/" />

<default-servlet-handler />
  

此标记允许将DispatcherServlet映射到&#34; /&#34; (从而   覆盖容器的默认Servlet的映射,同时   仍然允许静态资源请求由。处理   容器的默认Servlet [...]

enter link description here

也许你对这个春天的安全内容很有用。

<强> CustomWebSecurityConfigurerAdapter

我们的HelloWebSecurityConfiguration示例演示了Spring Security Java配置可以为我们提供一些非常好的默认设置。我们来看看一些基本的定制。

@EnableWebSecurity
@Configuration
public class CustomWebSecurityConfigurerAdapter extends
   WebSecurityConfigurerAdapter {
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) {
    auth
      .inMemoryAuthentication()
        .withUser("user")  // #1
          .password("password")
          .roles("USER")
          .and()
        .withUser("admin") // #2
          .password("password")
          .roles("ADMIN","USER");
  }

  @Override
  public void configure(WebSecurity web) throws Exception {
    web
      .ignoring()
         .antMatchers("/resources/**"); // #3
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeUrls()
        .antMatchers("/signup","/about").permitAll() // #4
        .antMatchers("/admin/**").hasRole("ADMIN") // #6
        .anyRequest().authenticated() // 7
        .and()
    .formLogin()  // #8
        .loginUrl("/login") // #9
        .permitAll(); // #5
  }
}

假设我们调整AbstractAnnotationConfigDispatcherServletInitializer以加载我们的新配置,我们的CustomWebSecurityConfigurerAdapter将执行以下操作:

  • 允许使用名为“user”的用户进行内存身份验证
  • 允许使用名为的管理用户进行内存身份验证 “管理员”
  • 忽略以“/ resources /”开头的任何请求。这类似于 使用XML命名空间时配置http @ security = none 配置。
  • 允许任何人(包括未经身份验证的用户)访问这些网址 “/ signup”和“/ about”
  • 允许任何人(包括未经身份验证的用户)访问这些网址 “/ login”和“/ login?error”。 permitAll()在这种情况下意味着, 允许访问formLogin()使用的任何URL。
  • 任何以“/ admin /”开头的网址都必须是管理用户。 对于我们的示例,那将是用户“admin”。
  • 所有剩余的网址都要求用户成功 认证
  • 使用Java配置设置基于表单的身份验证 默认值。 POST提交给后执行身份验证 URL“/ login”,参数“username”和“password”。
  • 明确说明登录页面,这意味着开发人员是 请求GET / login时呈现登录页面。

对于那些熟悉基于XML的配置的人,上面的配置与以下XML配置非常相似:

<http security="none" pattern="/resources/**"/>
<http use-expressions="true">
  <intercept-url pattern="/logout" access="permitAll"/>
  <intercept-url pattern="/login" access="permitAll"/>
  <intercept-url pattern="/signup" access="permitAll"/>
  <intercept-url pattern="/about" access="permitAll"/>
  <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
  <logout
      logout-success-url="/login?logout"
      logout-url="/logout"
  />
  <form-login
      authentication-failure-url="/login?error"
      login-page="/login"
      login-processing-url="/login"
      password-parameter="password"
      username-parameter="username"
  />
</http>
<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="user" 
          password="password" 
          authorities="ROLE_USER"/>
      <user name="admin" 
          password="password" 
          authorities="ROLE_USER,ROLE_ADMIN"/>
    </user-service>
  </authentication-provider>
</authentication-manager>

与XML命名空间的相似性

在查看稍微复杂的示例之后,您可能会发现XML命名空间和Java配置之间存在一些相似之处。以下是一些更有用的要点:

  • HttpSecurity与http命名空间元素非常相似。它 允许为特定选择配置基于Web的安全性(in 这种情况所有)请求。
  • WebSecurity与任何安全名称空间元素非常相似 适用于网络,不需要父母(即安全=无, 调试等)。它允许配置影响所有Web的事物 安全性。
  • WebSecurityConfigurerAdapter是一个允许的便利类 自定义WebSecurity和HttpSecurity。我们可以扩展 WebSecurityConfigurerAdapter多次(在不同的对象中)到 复制具有多个http元素的行为。
  • 通过格式化我们的Java配置代码,它更容易阅读。 它可以读取类似于XML命名空间等效的“and()” 表示可选地关闭XML元素。

Spring Security Java Config Preview