2016-11-09 3 views
2

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 /registerRegistrieren 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!

+0

Bitte sagen Sie mir, dass Sie die Passwörter nicht als Klartext in der Datenbank speichern. – bradimus

+0

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

+1

sie sind nicht als Spieltext gespeichert. Ich benutze BCryptPasswordEncoder – skywalker

Antwort

0

Ihre Sicherheitskonfiguration ist zu einfach. Sie können eine Menge mehr hinzufügen. Zum Beispiel können Sie Rollen hinzufügen, Standard-Zugriffsseite, Fehlerseite usw. Ich kann sehen, dass für die Registrierung von Benutzern Sie Post verwendet haben, was gut ist, weil Sie Daten übermitteln müssen. Denken Sie jedoch daran, dass der Post nicht idempotent ist, was bedeutet, dass die Wiederholung nicht sicher ist. Daher müssen Sie in Ihrer Registriermethode im Controller mindestens redirect:/your_desired_page nach der Registrierung verwenden, wenn Sie nicht die Federsicherheit dafür verwenden möchten (siehe Unterschied zwischen GET und POST für weitere Informationen). Da Sie angular verwenden und json zurückgeben müssen, rate ich Ihnen, anstelle von UserDetailsService einen benutzerdefinierten Authentifizierungsanbieter zu verwenden (siehe here), der Ihnen mehr Freiheit bei der Rückgabe von Daten und der Fehlerbehandlung gibt.

Verwandte Themen