我正试图在我的spring引导应用程序中实现spring安全性。但是每当我登录时,我都会得到和无限的查询,最终导致堆栈溢出错误。
Hibernate: select useraccoun0_.id as id1_1_, useraccoun0_.email as email2_1_, useraccoun0_.first_name as first_na3_1_, useraccoun0_.last_name as last_nam4_1_, useraccoun0_.password as password5_1_, useraccoun0_.status as status6_1_ from user_account useraccoun0_ where useraccoun0_.email=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?
Hibernate: select roles0_.userid as userid1_1_0_, roles0_.roleid as roleid2_2_0_, role1_.id as id1_0_1_, role1_.name as name2_0_1_ from user_roles roles0_ inner join role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
Hibernate: select user0_.roleid as roleid2_0_0_, user0_.userid as userid1_2_0_, useraccoun1_.id as id1_1_1_, useraccoun1_.email as email2_1_1_, useraccoun1_.first_name as first_na3_1_1_, useraccoun1_.last_name as last_nam4_1_1_, useraccoun1_.password as password5_1_1_, useraccoun1_.status as status6_1_1_ from user_roles user0_ inner join user_account useraccoun1_ on user0_.userid=useraccoun1_.id where user0_.roleid=?这是我的用户DTO
@Data
@ToString(exclude = "password")
@Entity
public class UserAccount {
public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();
@Id
@GeneratedValue
private long id;
private String email;
private String firstName;
private String lastName;
@JsonIgnore
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "userID"), inverseJoinColumns = @JoinColumn(name = "roleID"))
private Set<Role> roles = new HashSet<>();
@Enumerated(EnumType.ORDINAL)
private Status status;
public void setPassword(String password) {
this.password = PASSWORD_ENCODER.encode(password);
}
}这是我的角色DTO
@Data
@Entity
public class Role {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER)
private Set<UserAccount> user = new HashSet<>();
}这是我的CustomUserDetailsService
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository repository;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
UserAccount user = repository.findByEmail(email);
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new User(user.getEmail(), user.getPassword(), authorities);
}
}这是我的SecurityConfig
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsServiceImpl userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(UserAccount.PASSWORD_ENCODER);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/built/**", "/css/main.css","/css/vendor/flexboxgrid.css").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.defaultSuccessUrl("/", true)
.permitAll()
.and()
.httpBasic()
.and()
.csrf().disable()
.logout()
.logoutSuccessUrl("/");
}我真的找不到我的配置有什么问题。谢谢你提前提供帮助。
发布于 2016-04-20 04:07:54
我弄清楚了出了什么问题,终于开始工作了。我把Set改成了Collection。好像是个冬眠虫。
发布于 2016-04-20 03:05:45
您的user_role表不应该与user_account表有关系。user_account应该与user_role有一个one to many关系。您将得到无限循环,因为user_role与user_account有一个循环关系。
https://stackoverflow.com/questions/36733034
复制相似问题