-1

Ich werde eine Anmeldeseite mit Spring Boot und Sicherheit entwickeln, die Benutzer und Rollen von Admin erstellt werden können, so dass das System viele Rollen und Benutzer haben kann ... auch Admin zuweisen kann Rollen an Benutzer und entfernen Sie sie auch. Ich habe gute Beispiele verwendet, wie es zu implementieren, aber nach dem Lesen so viel Doc und Tutorials immer noch unter Fragen und nicht wissen, was ist die beste Praxis, Spring Security zu implementieren und gemeinsam zu booten.Versucht, auf Debug-Modus zu bewegen, um herauszufinden Was passiert hinter der Szene Schritt für Schritt.Spring Boot und Sicherheit Dynamische Authentifizierung und Autorisierung

meine Annahme war für jede HTTP-Anfrage-Anwendung bezieht sich auf WebSecurityConfig-Klasse, um den Zugriff zu überprüfen, aber überraschend war es nicht so und Kollegen war wie unten.Sie Anwendung geht zu Config-Klasse einmal am Anfang und alle Dinge bevölkert. Bootstrap macht so viele Aktionen im Hintergrund und es hat mich verwirrt und kann die Beziehung zwischen den Klassen nicht verstehen.

configureGlobal -> konfigurieren -> was auch immer Sie als URL schreiben geht es/login) -> Controller (Login-Methode) -> Übermitteln Sie das Formular mit Benutzer/pass -> loadUserByUsername -> Controller (Willkommen Methode) -> welcome.jsp

1-was genau configureGlobal und konfigurieren tun, wenn die Anwendung lädt?

2-Was ist die genaue Rolle von AuthenticationManagerBuilder?

3-wie Frühling Sicherheit weiß, um den Benutzer/pass nach Formularunterordnung zu loadUserByUsername Methode zu senden?

4-loadUserByUsername Benutzerobjekt zurückgeben wo? Denn wenn Methoden bis zum Ende reichen, werden sie zur Willkommens-Methode des Controllers umgeleitet und Sie erhalten eine Willkommens-Methode, wenn Benutzername und Passwort korrekt sind.

4-how to assignedAuthorities verwendet, um den Benutzer basierend auf seiner Rolle auf verschiedene Seiten umzuleiten?

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
 

 
<c:set var="contextPath" value="${pageContext.request.contextPath}"/> 
 

 
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
 
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> 
 
    <meta name="description" content=""> 
 
    <meta name="author" content=""> 
 

 
    <title>Log in with your account</title> 
 

 
    <link href="${contextPath}/resources/css/bootstrap.min.css" rel="stylesheet"> 
 
    <link href="${contextPath}/resources/css/common.css" rel="stylesheet"> 
 

 
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> 
 
    <!--[if lt IE 9]> 
 
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> 
 
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> 
 
    <![endif]--> 
 
</head> 
 

 
<body> 
 

 
<div class="container"> 
 

 
    <form method="POST" action="${contextPath}/login" class="form-signin"> 
 
     <h2 class="form-heading">Log in</h2> 
 
     <div class="form-group ${error != null ? 'has-error' : ''}"> 
 
      <span>${message}</span> 
 
      <input name="username" type="text" class="form-control" placeholder="Username" 
 
        autofocus="true"/> 
 
      <input name="password" type="password" class="form-control" placeholder="Password"/> 
 
      <span>${error}</span> 
 
      <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 
 

 
      <button class="btn btn-lg btn-primary btn-block" type="submit">Log In</button> 
 
      <h4 class="text-center"><a href="${contextPath}/registration">Create an account</a></h4> 
 
     </div> 
 
    </form> 
 

 
</div> 
 
<!-- /container --> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 
 
<script src="${contextPath}/resources/js/bootstrap.min.js"></script> 
 
</body> 
 
</html>

WebSecurityConfig Klasse

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private UserDetailsService userDetailsService; 

@Bean 
public BCryptPasswordEncoder bCryptPasswordEncoder() { 
    return new BCryptPasswordEncoder(); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
       .antMatchers("/resources/**", "/registration").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login").permitAll() 
       .and() 
      .logout().permitAll(); 

} 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); 
} 
} 

UserDetailsServiceImpl Klasse

@Service 
public class UserDetailsServiceImpl implements UserDetailsService{ 

@Autowired 
private UserRepository userRepository; 

@Override 
@Transactional(readOnly = true) 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 

    User user = userRepository.findByUsername(username); 

    Set<GrantedAuthority> grantedAuthorities = new HashSet<>(); 

    for (Role role : user.getRoles()){ 
     grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); 
    } 

    return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); 

} 
} 

Usercontroller Klasse

@Controller 
public class UserController { 
@Autowired 
private UserService userService; 

@Autowired 
private SecurityService securityService; 

@Autowired 
private UserValidator userValidator; 

@RequestMapping(value = "/registration", method = RequestMethod.GET) 
public String registration(Model model) { 
    model.addAttribute("userForm", new User()); 

    return "registration"; 
} 

@RequestMapping(value = "/registration", method = RequestMethod.POST) 
public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) { 

    userValidator.validate(userForm, bindingResult); 

    if (bindingResult.hasErrors()) { 
     return "registration"; 
    } 

    userService.save(userForm); 

    securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm()); 

    return "redirect:/welcome"; 
} 

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public String login(Model model, String error, String logout) { 
    if (error != null) 
     model.addAttribute("error", "Your username and password is invalid."); 

    if (logout != null) 
     model.addAttribute("message", "You have been logged out successfully."); 

    return "login"; 
} 

@RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET) 
public String welcome(Model model) { 
    return "welcome"; 
} 


} 
+0

Peter, Ihre Frage ist zu breit. Seien Sie spezifischer in dem Problem, das Sie haben, zeigen Sie, was Sie probiert haben und stellen Sie eine Frage nach der anderen. – jfneis

Antwort

0

Ich möchte die Antwort auf einige Fragen teilen, die mir jetzt klar.

  1. wenn Sie Ihr Projekt, zunächst einmal beginnen geht es zu WebSecurityConfig Klasse und sucht nach configureGlobal Methode des Authentifizierungsprozess zu bauen und sucht dann nach configure Methode, um die Sicherheit zu setzen.

  2. AuthenticationManagerBuilder ist eine Klasse mit vielen Methoden wie userDetailsService die verwendet wird, auf Benutzerdaten so authentifizieren basiert, wenn Sie es anmelden wird die credentails zu einer Klasse sendet die UserDetailsService Schnittstelle implementiert hat.

  3. Ein POST an die /login URL wird versuchen, den Benutzer zu authentifizieren, damit configureGlobal das Notwendige tut.

  4. Es hat von configureGlobal Methode aufgerufen und wird zurückgesichert da und immer noch alles im Root-Pfad ist, so wird die richtige Methode in Controller-Klasse finden.

  5. AuthenticationSuccessHandler kann in dieser Hinsicht helfen.

Verwandte Themen