SpringSecurity-SecurityConfiguration.java-HttpSecurity-不工作

SpringSecurity-SecurityConfiguration.java-HttpSecurity-不工作,java,angularjs,spring,maven,spring-mvc,Java,Angularjs,Spring,Maven,Spring Mvc,我正试图用已经包含的SpringBoot将Spring安全性实现到基于MVCMaven的项目中 我有工作的前端和后端,但到目前为止,我使用的是假登录-我只是通过JS和AngularJS查看用户名和密码等用户数据,然后将其发送到后端控制器,在后端控制器中通过DAO层检索数据库中的数据,并与发送witch响应后的作用域信息进行比较-如果是“OK”我将用户转发到用户主页,反之亦然。 这意味着,如果我运行我的应用程序并直接在浏览器栏中键入localhost:8080/#/user(只有登录的用户才能看到

我正试图用已经包含的SpringBoot将Spring安全性实现到基于MVCMaven的项目中

我有工作的前端和后端,但到目前为止,我使用的是假登录-我只是通过JS和AngularJS查看用户名和密码等用户数据,然后将其发送到后端控制器,在后端控制器中通过DAO层检索数据库中的数据,并与发送witch响应后的作用域信息进行比较-如果是“OK”我将用户转发到用户主页,反之亦然。 这意味着,如果我运行我的应用程序并直接在浏览器栏中键入localhost:8080/#/user(只有登录的用户才能看到的页面),我就可以毫无问题地访问它

现在,当业务逻辑层测试完成时,是时候实现Spring安全性了

我仍在尝试理解Spring安全性,并尝试正确地编写SecurityConfiguration.java文件——将其设置为不允许任何人访问book.html和user.html页面,并最终将此类用户重定向到login.html

这是我的SecurityConfiguration.java文件:

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Resource
    private DataSource dataSource;

    @Bean
    public BCryptPasswordEncoder PasseordEncoder() {
        return new BCryptPasswordEncoder();
    }

    protected void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        PasswordEncoder encoder = new BCryptPasswordEncoder();

        auth.userDetailsService(userDetailsService).passwordEncoder(encoder);
        auth.jdbcAuthentication().dataSource(dataSource);

        if (!userDetailsService.userExists("user")) {
            List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority("USER"));
            User userDetails = new User("user", encoder.encode("password"),
                    authorities);

            userDetailsService.createUser(userDetails);
        }

    }

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/user").access("hasRole('USER')")
                .antMatchers("/book").access("hasRole('USER')");
    }

}
@配置
@启用WebMVC安全性
@EnableGlobalMethodSecurity(Prespenabled=true)
公共类安全配置扩展了WebSecurity配置适配器{
@资源
私有数据源;
@豆子
公共BCryptPasswordEncoder PasseordEncoder(){
返回新的BCryptPasswordEncoder();
}
受保护的无效配置全局(AuthenticationManagerBuilder身份验证)
抛出异常{
JdbcUserDetailsManager userDetailsService=新的JdbcUserDetailsManager();
userDetailsService.setDataSource(数据源);
PasswordEncoder编码器=新的BCryptPasswordEncoder();
auth.userDetailsService(userDetailsService).passwordEncoder(编码器);
auth.jdbccauthentication().dataSource(dataSource);
如果(!userDetailsService.userExists(“用户”)){
列表权限=新建ArrayList();
添加(新的SimpleGrantedAuthority(“用户”);
User userDetails=新用户(“用户”,encoder.encode(“密码”),
当局);
userDetailsService.createUser(userDetails);
}
}
受保护的无效配置(HttpSecurity http)引发异常{
http.authorizeRequests()
.antMatchers(“/user”).access(“hasRole('user'))
.antMatchers(“/book”).access(“hasRole('USER')”);
}
}
但当我运行应用程序并尝试访问例如/用户时,它允许我!有人能帮我理解我该做什么,以及如何解决这个问题并通过第一步吗?

试试看

当前

http.authorizeRequests()
                .antMatchers("/user").access("hasRole('USER')")
                .antMatchers("/book").access("hasRole('USER')");
改为:

http.authorizeRequests()
                .antMatchers("/user").hasRole('USER')
                .antMatchers("/book").hasRole('USER');

希望对我有帮助。

我想你忘了声明身份验证的入口点。正如您在评论中所指出的,您需要添加
和().formLogin().loginPa‌​ge(“集合/登录”)
到您的
http.authorizeRequests()

但是,您还需要授权对登录页面的未经验证的访问,以避免重定向循环:询问页面->需要验证->重定向到登录页面->需要验证->重定向

您只需遵循以下关于Java配置和表单登录的参考手册示例即可:

使用您的代码,它将提供:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/user").access("hasRole('USER')")
        .antMatchers("/book").access("hasRole('USER')")
        .and().formLogin().loginPage("/collections/login").permitAll();
}

最后一句话:注意登录URL前面的
/
如果希望从
/
以外的任何页面找到您的登录页面,请始终使用绝对路径

您确定这个文件是由Spring处理的吗?您的日志中有来自Spring security的信息吗?我没有检查日志(直到现在才使用它),但是如果我将configure方法体更改为http.authorizeRequests().anyRequest().authorized()和()formLogin().loginPage(“集合/登录”)-我知道这个网页在localhost:8080上有一个重定向循环,这帮助我理解了这个概念是如何工作的,并看到SpringSecurity正在我的应用程序上工作。现在我有更多的问题,但我将不得不在稍后发布新的问题,因为我的应用程序正在使用AngularJS状态提供程序,我不知道如何在不使用绝对路径的情况下使其工作。。。
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/user").access("hasRole('USER')")
        .antMatchers("/book").access("hasRole('USER')")
        .and().formLogin().loginPage("/collections/login").permitAll();
}