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

Posted

技术标签:

【中文标题】Tomcat重启后基于spring security java的配置【英文标题】:spring security java based config after tomcat restart 【发布时间】:2014-12-07 10:29:23 【问题描述】:

我正在尝试学习 spring,但我的安全用户遇到了来自 spring-security 的问题。重新启动 tomcat 后,当我使用

<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

【问题讨论】:

你的 principal/UserDetails 类是什么样子的? 你好@holmis83 看看编辑,这是你想看的吗?谢谢你的帮助 【参考方案1】:

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

public class Usuario implements Serializable

还要确保您的用户名字段没有标记为transient

【讨论】:

它工作...我认为当SecurityUser实现UserDetails时,足以序列化安全对象,我还有一个关于序列化的问题,你认为我应该对所有实现序列化我的实体?...非常感谢!!!! @dTobon 我会说 YAGNI。

以上是关于Tomcat重启后基于spring security java的配置的主要内容,如果未能解决你的问题,请参考以下文章

重启后Spring没有将tomcat持久会话恢复到会话注册表?

IntelliJ IDEA 中的 Spring Boot 项目在重启后停止工作

springmvc 修改方法体需要重启tomcat吗

Spring Security:服务器重启后身份验证保持不变

Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit

Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit