【发布时间】: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