【问题标题】:How does Spring security understand what the user role is?Spring security 如何理解用户角色是什么?
【发布时间】:2018-10-14 03:35:50
【问题描述】:

我有一个问题。我有以下配置

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
      auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery(
                        "select username,password, enabled from user where username=?")
                .authoritiesByUsernameQuery(
                        "select username, role from user inner join role on user.role_id = role.id where username=?").passwordEncoder(passwordencoder());
    }

    @Bean(name="passwordEncoder")
    public Md5PasswordEncoder passwordencoder(){
        return new Md5PasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        http.addFilterBefore(filter,CsrfFilter.class);
        http.
                formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/add-ticket")
                .failureUrl("/"); 
        http
                .authorizeRequests()
                .antMatchers("/add-ticket").hasRole("ADMIN");
    }
}

问题是 Spring 安全性如何理解用户角色是什么?我的意思是,它在授权后会在会话中保存一些信息还是什么?例如,它将用户名保存在会话中,并且每个请求都通过用户名从数据库中获取角色?我不明白这一点。你能帮忙吗?

【问题讨论】:

  • 了解用户角色是什么,因为您提供了用于提供该信息的查询。如果您想确切知道该查询的执行时间和频率,您应该查看 Spring 的源代码,甚至可以使用调试器逐步执行代码。
  • 但是由于您没有提供userCache,它可能会查询每个网络请求。
  • 但是如果查询通过用户名选择角色,它如何查询每个网络请求?除授权外的其他请求没有用户名字段。
  • 所以你的问题实际上是 Spring 如何记住 user,而不是它如何理解 roles。用户登录后,用户将存储在 Session 属性中,并创建一个标识会话对象的 HTTP cookie,并在任何后续请求中再次接收,这有助于 Spring Security 识别用户。

标签: java spring-security


【解决方案1】:

一旦用户获得授权,Spring 会将他的角色保留在 GrantedAuthority 对象中。例如。在GrantedAuthority 实现中:SimpleGrantedAuthority wchich 只有一个字段 -> role

所有权限都保存在Authentication 对象中 wchich 保存在SecurityContext wchich 与当前执行线程相关联。

【讨论】:

猜你喜欢
  • 2012-08-16
  • 2016-10-03
  • 2011-07-21
  • 2014-10-11
  • 1970-01-01
  • 2019-12-18
  • 2013-12-08
  • 2014-09-14
  • 1970-01-01
相关资源
最近更新 更多