Spring MVC安全性无法保护视图

时间:2017-06-15 10:46:58

标签: java spring spring-mvc spring-security

以下示例未正确保护我的观看次数。视图正在呈现并显示它们没有正确保护。

视图存在于WEB-INF / jsp中,并包含一个带Angular Router的Angular应用程序。

我不认为Angular应用程序和路由器是根本原因所以我没有将它们包含在下面。如果是,我很乐意提供代码。

我也在使用带有H2,Data JPA,Hibernate等的CustomUserDetailsS​​ervice。我没有包含,因为现在的主要问题是保护路由而不是实际的身份验证和持久性流本身。同样,也许这些项目配置不正确。

非常感谢任何帮助!谢谢!

的AppConfig:

@Configuration
@EnableWebMvc
@ComponentScan()
public class AppConfig extends WebMvcConfigurerAdapter {

    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/secured/socket").setViewName("socket");
        registry.addViewController("/secured/success").setViewName("success");
        registry.addViewController("/denied").setViewName("denied");
    }

    @Bean
    public UrlBasedViewResolver viewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/", "/resources/")
                .setCachePeriod(3600)
                .resourceChain(true)
                .addResolver(new PathResourceResolver());
    }
}

SecurityConfig:

@Configuration
@EnableGlobalAuthentication
@ComponentScan
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .antMatchers("/index").permitAll()
                    .antMatchers("/denied").permitAll()
                    .antMatchers("/authenticate").permitAll()
                    .antMatchers("/secured/socket").authenticated()
                    .antMatchers("/secured/success").authenticated()
                    .antMatchers("/secured/pet").authenticated()
                    .antMatchers("/secured/**/**").authenticated()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login").permitAll()
                    .usernameParameter("username").passwordParameter("password")
                    .loginProcessingUrl("/authenticate")
                    .defaultSuccessUrl("/secured/success",true)
                    //.failureUrl("/login.html?error=true")
                    .and()
                .logout()
                    .logoutSuccessUrl("/index").permitAll()
                    .and()
                .exceptionHandling()
                    .accessDeniedPage("/denied")
                    .and()
                .csrf();
    }
}

编辑:为了帮助澄清问题 - 路由/secured/successsuccess.jsp不需要访问或查看身份验证。上面指定的任何其他视图都没有。他们应该。

2 个答案:

答案 0 :(得分:1)

您似乎在@EnableWebSecurity忘记了SecurityConfig注释。

答案 1 :(得分:0)

好的,我想我解决了这个问题 - 上面的配置文件没问题,但我忘记通过以下方式添加springSecurityFilterChain

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
   //do nothing
}

以及:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@ComponentScan(//...)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//...
}

显然,虽然我可能会弄错,但必须明确说明@EnableWebSecurity才能触发使用springSecurityFilterChain