【问题标题】:Spring 4 MVC + security issueSpring 4 MVC + 安全问题
【发布时间】:2016-08-23 07:34:41
【问题描述】:

我一直在使用 Spring MVC 应用程序。打算增加安全性。一切正常。

根据文档 http://docs.spring.io/autorepo/docs/spring-security/4.0.4.RELEASE/reference/htmlsingle/#abstractsecuritywebapplicationinitializer-with-spring-mvc

添加了下一个实现。

  1. MessageSecurityWebApplicationInitializer
  2. MessageWebApplicationInitializer
  3. 安全配置

登录表单有效。

授权成功后,得到 - HTTP Status 404 -

我也可以在授权后将方​​法调试到appController中,我的意思是下一个方法public String listPatients(ModelMap model)。

为什么我有 404 ?我应该解决什么问题?

public class MessageSecurityWebApplicationInitializer
        extends AbstractSecurityWebApplicationInitializer {
}


public class MessageWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{AppConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{AppConfig.class};
    }


    @Override
    protected String[] getServletMappings() {
        return new String[] {"/*"};
    }

}

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");
    }

    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .and()
                .httpBasic();
    }

}

@Controller
@RequestMapping("/")
public class AppController {

    public static final String jsonPage = "json";
    @RequestMapping(value = {"/"}, method = RequestMethod.GET)
    public String listPatients(ModelMap model) {
        model.addAttribute("json", "test"}");
        return jsonPage;
    }

BR!

【问题讨论】:

  • 我建议使用 Spring security + Spring MVC 打开日志记录,看看它在做什么。
  • 对于初学者,请停止两次加载您的应用程序。您的AppConfig 正在为root 和servlet 上下文加载AppConfig,有效地复制了您的整个应用程序。在根(服务、存储库、基础设施)和 servlet 上下文(与网络相关的东西,如控制器等)中拆分您的配置。
  • 我同意@M.Deinum。如果您在启动时检查日志,您可以看到您正在创建两个上下文。不要这样做并拆分您的配置(请查看下面的答案)
  • 可能是打错了,但这里不应该把这个符号“}”删掉吗?“model.addAttribute("json", "test"}");" ?

标签: java spring spring-mvc spring-security


【解决方案1】:

这就是我所拥有的(工作):

AppInitializer

public class AppInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {
                SpringRootConfig.class,
                DatabaseConfig.class,
                SecurityConfig.class,
                SecurityInitializer.class,
                WsdlMarshallerConfig.class
        };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { SpringWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

安全初始化器

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}

安全配置

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        // @formatter:off
        auth
            .jdbcAuthentication()
                .dataSource(dataSource)
                    .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?")
                    .authoritiesByUsernameQuery("SELECT username, role FROM user_roles WHERE username = ?");
        // @formatter:on
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .and()
            .csrf()
                .disable();
        // @formatter:on
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多