2015-09-09 3 views
0

Я только что переместил свой класс на объект, который использует расширение класса Spring Security Authentication User, и я не могу понять, какой конструктор по умолчанию мне нужно построить! Если я помещаю параметры класса, он преобразует их в static и делает hibernate неспособным отображать класс, если я ничего не ставил, он выдает ошибку!По умолчанию конструктор необоснован весной

@Entity 
@Table(name="USER") 
public class UserData extends User { 


    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    int iduser; 
    int accountstatus; 
    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPass(String password) { 
     this.password = password; 
    } 
    String username; 
    String password; 

    //Profile Data 
    String nomprofile; 
    String prenprofile; 
    String mailprofile; 
    String adressprofile; 
    int phoneprofile; 
    Date datenaissanceprofile; 
    char sexeuser; 
    String imagepath; 

    public UserData() { 
     super(username, password, authorities); //throws error 
    } 

    public UserData(String username, 
      String password, 
      boolean enabled, 
      boolean accountNonExpired, 
      boolean credentialsNonExpired, 
      boolean accountNonLocked, 
      Collection<? extends GrantedAuthority> authorities, 
      int iduser,  
      int accountstatus, 
      String nomprofile, 
      String prenprofile, 
      String mailprofile, 
      String adressprofile, 
      int phoneprofile, 
      Date datenaissanceprofile, 
      char sexeuser, 
      String imagepath) { 
     super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
     this.username = username; 
     this.password = password; 
     this.iduser = iduser; 
     this.accountstatus = accountstatus; 
     this.nomprofile = nomprofile; 
     this.prenprofile = prenprofile; 
     this.mailprofile = mailprofile; 
     this.adressprofile = adressprofile; 
     this.phoneprofile = phoneprofile; 
     this.datenaissanceprofile = datenaissanceprofile; 
     this.sexeuser = sexeuser; 
     this.imagepath = imagepath; 
    } 

    public int getIduser() { 
     return iduser; 
    } 
    public void setIduser(int iduser) { 
     this.iduser = iduser; 
    } 


    public int getAccountstatus() { 
     return accountstatus; 
    } 
    public void setAccountstatus(int accountstatus) { 
     this.accountstatus = accountstatus; 
    } 


    public String getNomprofile() { 
     return nomprofile; 
    } 
    public void setNomprofile(String nomprofile) { 
     this.nomprofile = nomprofile; 
    } 
    public String getPrenprofile() { 
     return prenprofile; 
    } 
    public void setPrenprofile(String prenprofile) { 
     this.prenprofile = prenprofile; 
    } 
    public String getMailprofile() { 
     return mailprofile; 
    } 
    public void setMailprofile(String mailprofile) { 
     this.mailprofile = mailprofile; 
    } 
    public String getAdressprofile() { 
     return adressprofile; 
    } 
    public void setAdressprofile(String adressprofile) { 
     this.adressprofile = adressprofile; 
    } 
    public int getPhoneprofile() { 
     return phoneprofile; 
    } 
    public void setPhoneprofile(int phoneprofile) { 
     this.phoneprofile = phoneprofile; 
    } 
    public Date getDatenaissanceprofile() { 
     return datenaissanceprofile; 
    } 
    public void setDatenaissanceprofile(Date datenaissanceprofile) { 
     this.datenaissanceprofile = datenaissanceprofile; 
    } 
    public char getSexeuser() { 
     return sexeuser; 
    } 
    public void setSexeuser(char sexeuser) { 
     this.sexeuser = sexeuser; 
    } 
    public String getImagepath() { 
     return imagepath; 
    } 
    public void setImagepath(String imagepath) { 
     this.imagepath = imagepath; 
    } 
} 
+0

Пожалуйста, включите ваш класс 'User' или укажите полное имя класса, если оно находится в публичной библиотеке. –

+0

Пользователь является импортом org.springframework.security.core.userdetails.User; –

+0

какая ошибка вы получаете? –

ответ

2

Вместо расширения класса пользователей из весенне-безопасности лучше реализовать UserDetails интерфейс заданный из пружинной безопасности. пожалуйста, прочтите приведенный ниже код. Предоставьте пользовательскую реализацию userDetailsService для вашего проекта. я надеюсь, что это поможет вы- http://docs.spring.io/spring-security/site/docs/3.0.x/reference/technical-overview.html#d0e1613

public class User implements UserDetails{ 

private UserData userData; 
private List<String> roles; 

public User(UserData user){ 
    this.userData=user; 

} 



public Collection<? extends GrantedAuthority> getAuthorities() { 
    List<SimpleGrantedAuthority> authorities=new ArrayList<SimpleGrantedAuthority>(); 
    for (String role : userData.getRoles()) { 
     authorities.add(new SimpleGrantedAuthority(role)); 
    } 
    return authorities; 
} 

public String getPassword() { 
    return user.getPassword(); 
} 

public String getUsername() { 
    // TODO Auto-generated method stub 
    return user.getUsername(); 
} 

public boolean isAccountNonExpired() { 
    // TODO Auto-generated method stub 
    return true; 
} 

public boolean isAccountNonLocked() { 
    // TODO Auto-generated method stub 
    return true; 
} 

public boolean isCredentialsNonExpired() { 
    // TODO Auto-generated method stub 
    return true; 
} 

public boolean isEnabled() { 
    // TODO Auto-generated method stub 
    return true; 
} 

}

+0

Не могли бы вы объяснить, почему лучше реализовать, чем продлить? Класс пользователя из безопасности имеет все получатели, сеттеры и требуемые свойства. Я имею в виду, не переусердствовать с вещами, чтобы написать их точно так же, если вы хотите функциональность пользователя безопасности, но с несколькими дополнительными свойствами? – idchlife

+1

при вызове Object main = SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal(); вы получите главный объект, который является UserDetails. Используя этот объект, вы можете получить доступ только к функциям функции безопасности. Но если вы реализуете UserDetails в своем приложении, мы можем иметь контроль над объектом Principal. Из вышеприведенного вопроса вы не можете получить доступ к функциям UserData, если вы продлеваете Spring User. –

-1

Можете ли вы предоставить ошибку stacktrace? Это может помочь решить эту проблему.

Я понимаю, что это класс, который вы распространяете: org.springframework.security.core.userdetails.User? Если это так, у него есть 2 конструктора, которые вы можете переопределить в своем коде при создании новых экземпляров. Если вы переопределите их, я рекомендую вам называть супер на каждом, так как они фактически выполняют инициализацию экземпляра. Например:

public UserData(String username, String password, Collection<? extends GrantedAuthority> authorities) { 
    super(username, password, authorities); 
    // Your code here. 
} 

public UserData(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) { 
    super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
    // Your code here. 
} 

Но поскольку Hibernate не будет вызывать эти конструкторы для вас по умолчанию, вы должны предоставить конструктор без аргументов. Для этого я бы добавил следующее:

UserData() { 
    // Hibernate 
} 

Спящий режим должен иметь возможность загружать ваш постоянный класс.

Update:

Хорошо, я вижу эту проблему и есть решение. Удалите существующий код:

public UserData() { super(username, password, authorities); //throws error }

заменить его:

public UserDetail(){ this(null, null, null); }

+0

UserData() {} Неявный супер конструктор User() не определен. Должен явно ссылаться на другой конструктор –

+0

Правильно, не пытайтесь вызвать super() в конструкторе no arg. –

+0

Вот что дает ошибка ... –

0

Я предпочитаю, чтобы отделить сущность и данных связанных с безопасностью обработчиков.

@Entity 
public class UserEntity {} 

public class SecureUserPrinicipal extends org.spring..User { 
    public SecureUserPrinicipal getSecureUserPrincipal(final UserEntity userEntity){ 
     return new SecureUserPrinicipal(userEntity.getUsername(),.....);  
    } 

} 

Плюсы:

  1. Четкое разделение модели и безопасности слоев и многоразовых компонентов.
  2. SecureUserPrinicipal просто нуждается в полях, связанные с безопасностью, не все UserEntity поля, такие как пол, телефон и т.д.
  3. Мы можем иметь отдельные аспекты по каждому классу, как регистраторы, статистика и т.д.
  4. проверяемых отдельно.
  5. Сделки, спящий режим сеанса магии будет работать на UserEntity, Пример: если пользователь изменяет пароль UserEntity будет сохранен, вы хотите аннулировать вошедший в SecureUserPrincipal из-за этого, не уверен, что правильно? Управление пользователями db и управление входами в пользовательские сеансы. Принципы различны.

Против: Если пользовательский интерфейс эволюционирует, нам необходимо адаптировать SecureUserPrinicipal, если это поле задействовано в безопасности очень редко.

Смежные вопросы