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";
}
}
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