tomcat重启后的spring security基于java的配置

时间:2014-10-12 21:25:13

标签: java spring-mvc tomcat spring-security

我正在尝试学习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

1 个答案:

答案 0 :(得分:2)

您的Usuario课程不包括在内,但我的猜测是它没有实现java.io.Serializable。重新启动Tomcat时,会话将序列化以存储在磁盘上。默认情况下,只编写实现Serializable的类中的字段(即使子类实现Serializable)。所以你的类声明应该类似于:

public class Usuario implements Serializable

另外,请确保您的用户名字段标记为transient