SpringSecurity - SecurityConfiguration.java - HttpSecurity - 无法正常工作

时间:2014-08-19 15:00:01

标签: java angularjs spring maven spring-mvc

我正在尝试将Spring Security实现到我已经包含Spring Boot的基于MVC Maven的项目中。

我有前端和后端工作,但直到现在我才使用伪登录 - 我只是通过JS和AngularJS确定用户数据和用户数据,并将其发送到后端控制器,数据来自数据库通过DAO层检索并与发送回复后的范围信息进行比较 - 如果它是“OK”,我将用户转发到用户主页,反之亦然。 这意味着,如果我运行我的应用程序并直接键入浏览器栏 localhost:8080 /#/ user (只有用户可以看到的页面)我可以毫无问题地访问它

现在,当业务逻辑层测试完成时,实现Spring Security的时机已经到来。

我仍在尝试了解Spring Security并尝试正确编写SecurityConfiguration.java文件 - 让它设置为不会让任何人访问book.html和user.html页面,并最终将此类用户重定向到登录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')");
    }

}

但是当我运行应用程序并尝试访问例如/ user时,它允许我!有人可以帮助我理解我该做什么,以及如何解决这个问题并通过第一步?

2 个答案:

答案 0 :(得分:1)

我认为您忘记申报身份验证的入口点。正如您在评论中指出的那样,您需要将.and().formLogin().loginPa‌​ge("collections/login")添加到http.authorizeRequests()

但是,您还需要授权对登录页面进行未经身份验证的访问以避免重定向循环:询问页面 - &gt;需要身份验证 - &gt;重定向到登录页面 - &gt;需要身份验证 - &gt;重定向......

您应该遵循以下关于 Java配置和表单登录的参考手册示例:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login") 
            .permitAll();        
}

使用您的代码,它会给出:

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();
}

上次评论:请注意登录网址前面的 / 。如果您希望从/以外的任何页面找到您的登录页面,始终使用绝对路径

答案 1 :(得分:0)

放手一搏

当前

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

更改为:

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

希望有所帮助(为我工作)。