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 项目在重启后停止工作
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