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

如何修复Spring Security中的角色?

如何修复Spring Security中的角色?

慕的地6264312 2019-11-04 13:05:42
我试图在我的项目中使用Spring Security,这是代码:@Overrideprotected 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_");}   @Overrideprotected 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

TA贡献1871条经验 获得超8个赞

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
?
阿晨1998

TA贡献2037条经验 获得超6个赞

问题在于配置时的规则顺序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
  • 2 回答
  • 0 关注
  • 733 浏览

添加回答

举报

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