我正在尝试学习spring,而且我的安全用户遇到了问题,从spring-security开始。重新启动tomcat后,当我使用
时,它将我当前的loged用户留空<security:authentication property="principal.username"/>
标签。
我的spring-security配置很简单
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder registry)throws Exception{
Md5PasswordEncoder e = new Md5PasswordEncoder();
registry.userDetailsService(customUserDetailsService).passwordEncoder(e);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.antMatchers("/webjars/**").permitAll()
.antMatchers("/admin/**").hasAuthority("ADMIN")
.anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll()
.and().logout().permitAll();
}
}
我见过this,但它让我觉得我必须在安全配置中改变很多东西
修改:
这是我的SecurityUser
public class SecurityUser extends Usuario implements UserDetails {
private static final long serialVersionUID = 1L;
public SecurityUser(Usuario usuario) {
this.setEliminado(usuario.isEliminado());
this.setFechaCreacion(usuario.getFechaCreacion());
this.setPassword(usuario.getPassword());
this.setRoles(usuario.getRoles());
this.setUltimaModificacion(usuario.getUltimaModificacion());
this.setUsername(usuario.getUsername());
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
Set<Rol> userRoles = this.getRoles();
if (userRoles != null) {
for (Rol role : userRoles) {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role.getDescripcion());
authorities.add(authority);
}
}
return authorities;
}
@Override
public String getPassword(){
return super.getPassword();
}
@Override
public String getUsername(){
return super.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
这是我的UserServiceDetalis:
@Component
public class CustomUserDetailsService implements UserDetailsService{
@Autowired
private UsuarioRepository usuarioService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Usuario u = usuarioService.findByUsername(username);
if(u==null)
throw new UsernameNotFoundException("No se ha encontrado el usuario "+username);
return new SecurityUser(u);
}
}
我正在使用基于java的配置,因此我没有web.xml文件
无论你需要看什么,请告诉我,我会发布它
谢谢你的帮助!!!
PD:对不起我的英文:P
答案 0 :(得分:2)
您的Usuario
课程不包括在内,但我的猜测是它没有实现java.io.Serializable
。重新启动Tomcat时,会话将序列化以存储在磁盘上。默认情况下,只编写实现Serializable
的类中的字段(即使子类实现Serializable
)。所以你的类声明应该类似于:
public class Usuario implements Serializable
另外,请确保您的用户名字段不标记为transient
。