如何修复Spring Security中的角色?

我试图在我的项目中使用Spring Security,这是代码:


@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    // TODO Auto-generated method stub

    //super.configure(auth);

    //auth.inMemoryAuthentication().withUser("admin").password("1111").roles("USER");

    auth

        .jdbcAuthentication()

            .dataSource(dataSource)

            .usersByUsernameQuery("select username, password, 1 from users where username=?")

            .authoritiesByUsernameQuery("select users_username, roles_id  from roles_users where users_username=?")

            .rolePrefix("ROLE_");

}   


@Override

protected void configure(HttpSecurity http) throws Exception {

    http

        .csrf().disable();      

    http

        .httpBasic();

    http

        .authorizeRequests()

            .anyRequest().authenticated();

    http

        .authorizeRequests()

            .antMatchers("/users/all").hasRole("admin")

            .and()

        .formLogin();

    http

        .exceptionHandling().accessDeniedPage("/403");

}

这是问题所在:


假设我们的数据库中有两个用户(一个是user角色,另一个是admin角色),一个是管理员,第二个是用户,问题是当我以用户身份(只有user角色)连接时可以访问管理资源(这不是预期的行为)。


我认为此查询中的问题:


"select username, password, 1 from users where username=?" 

根据那username是主键?


如果有人知道如何解决此问题?


慕的地6264312
浏览 734回答 2
2回答

ITMISS

anyRequest()始终应用第一个匹配器,因为匹配器的顺序很重要,请参见HttpSecurity#authorizeRequests:注意匹配器是按顺序考虑的。因此,以下内容无效,因为第一个匹配器匹配每个请求,并且永远不会到达第二个映射:http.authorizeRequests().antMatchers("/**").hasRole("USER").antMatchers("/admin/**")            .hasRole("ADMIN")您修改和简化的配置:@Overrideprotected void configure(HttpSecurity http) throws Exception {    http        .csrf().disable()              .httpBasic()            .and()        .authorizeRequests()            .antMatchers("/users/all").hasRole("admin")            .anyRequest().authenticated()            .and()        .formLogin()            .and()        .exceptionHandling().accessDeniedPage("/403");}

阿晨1998

问题在于配置时的规则顺序HttpSecurity。发生的情况是当请求传入并到达authorizeRequests().anyRequest().authenticated() 由于用户已通过身份验证,因此永远不会进入.antMatchers("/users/all").hasRole("admin")这是如何配置它的示例:@Overrideprotected void configure(HttpSecurity http) throws Exception {    http        .csrf().disable()              .httpBasic()        .and()    .authorizeRequests()        .antMatchers("/public").permitAll()        .antMatchers("/user").hasRole("USER")        .antMatchers("/admin").hasRole("ADMIN")        .anyRequest().authenticated()        .and()    .formLogin()        .and()    .exceptionHandling().accessDeniedPage("/403");}它使用责任链模式。它将遍历规则链,直到找到匹配的规则。永远不会达到匹配规则之后的任何规则。通常,在编写用于经过身份验证的请求的规则时,将优先考虑更具体的规则。
打开App,查看更多内容
随时随地看视频慕课网APP