Ich habe eine Frage zum Hinzufügen neuer Benutzer mit Feder und Winterschlaf. Ich benutze Spring-Sicherheit für die Authentifizierung und ich konnte es mit Oracle DB konfigurieren. Als nächstes möchte ich einen neuen Benutzer registrieren. Wie sieht der übliche Ansatz in diesem Fall aus? Ich lese einige Materialien, aber die meisten von ihnen wurden mit jsp entworfen und implementiert und meine Kundenseite ist in angularjs geschrieben. Was ich bisher habe, ist ein Controller mit zwei Endpunkten /user
und /register
Registrieren neuer Benutzer mit Frühling und überwintern
@Controller
public class UserController {
@Autowired
private RegisterService registerService;
@RequestMapping("/user")
@ResponseBody
public Principal user(Principal user) {
return user;
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public void registerUser() {
User user = new User();
registerService.save(user);
}
}
Ich glaube, ich brauche auch einige Service. In meinem Fall ist dies RegisterService
und Durchführung dieses Dienstes RegisterServiceImpl:
@Service
public class RegisterServiceImpl implements RegisterService {
@Autowired
private UserDao userDao;
@Autowired
private SessionFactory sessionFactory;
@Transactional
@Override
public void save(User user) {
// what should be the implementation of this method?
Session session = sessionFactory.getCurrentSession();
session.save(user);
}
}
Hier meine UserDao
Entitätsklasse ist:
@Entity
@Table(name = "users")
public class User {
@Id
@Column(name = "id")
private int id;
@Column(name = "username")
private String userName;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@Column(name = "is_enabled")
private boolean isEnabled;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private Set<UserRole> userRole = new HashSet<UserRole>(0);
public User() {
}
public User(String username, String password, Boolean isEnabled, Set<UserRole> userRole) {
this.userName = username;
this.password = password;
this.isEnabled = isEnabled;
this.userRole = userRole;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return userName;
}
public void setUsername(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean isEnabled() {
return isEnabled;
}
public void setEnabled(boolean isEnabled) {
this.isEnabled = isEnabled;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Set<UserRole> getUserRole() {
return this.userRole;
}
public void setUserRole(Set<UserRole> userRole) {
this.userRole = userRole;
}
}
Meine Sicherheits Config wie folgt aussieht:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Autowired
LogoutSuccess logoutSuccess;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/profile", "/logout", "/home").permitAll()
.anyRequest().authenticated()
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
.csrf().disable();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/app/**");
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
}
Auf Benutzerregistrierung möchte ich alle Klassenmitglieder in User
setzen, aber ich bin mir nicht sicher, wie man das erreicht. Ich denke nicht, @PathVariable
für jedes Klassenmitglied zu erstellen wäre angemessen, weil ich sensible Daten Benutzername und Passwort senden werde. Vielen Dank für deine Antworten!
Bitte sagen Sie mir, dass Sie die Passwörter nicht als Klartext in der Datenbank speichern. – bradimus
Sie haben nicht eindeutig erwähnt, wie Sie bestehende Benutzer mit Federsicherheit authentifizieren. Wie entwirfst du deine Seite mit nur angularjs? und wie kommunizieren Sie zwischen Client und Server? Info, die Sie zur Verfügung gestellt haben, ist ein wenig unzureichend – Acewin
sie sind nicht als Spieltext gespeichert. Ich benutze BCryptPasswordEncoder – skywalker