为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复Spring Security中的角色?

/ 猿问

如何修复Spring Security中的角色?

慕的地6264312 2019-11-04 13:05:42

我试图在我的项目中使用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是主键?


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


查看完整描述

2 回答

?
ITMISS

anyRequest()始终应用第一个匹配器,因为匹配器的顺序很重要,请参见HttpSecurity#authorizeRequests:


注意匹配器是按顺序考虑的。因此,以下内容无效,因为第一个匹配器匹配每个请求,并且永远不会到达第二个映射:


http.authorizeRequests().antMatchers("/**").hasRole("USER").antMatchers("/admin/**")

            .hasRole("ADMIN")

您修改和简化的配置:


@Override

protected 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");

}


查看完整回答
反对 回复 2019-11-04
?
慕莱坞7535251

问题在于配置时的规则顺序HttpSecurity。发生的情况是当请求传入并到达


authorizeRequests().anyRequest().authenticated() 

由于用户已通过身份验证,因此永远不会进入


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

这是如何配置它的示例:


@Override

protected 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");

}

它使用责任链模式。它将遍历规则链,直到找到匹配的规则。永远不会达到匹配规则之后的任何规则。通常,在编写用于经过身份验证的请求的规则时,将优先考虑更具体的规则。


查看完整回答
反对 回复 2019-11-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信