Je travaille sur mon projet avec Spring Security et Thymeleaf. J'ai l'intégration de base de Spring Security.
SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private DataSource dataSource;
@Autowired
public void configureGlobal (AuthenticationManagerBuilder auth) throws Exception
{
auth
.jdbcAuthentication()
.dataSource(dataSource);
}
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/classesTable").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.and()
.httpBasic();
}
}
SecurityWebApplicationInitializer.java
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer
{
public SecurityWebApplicationInitializer(){
super(SecurityConfig.class);
}
}
Dans mon projet, j'ai trois rôles: étudiant, professeur et administrateur. Ce que je souhaite, c'est que mon élève se connecte pour qu'il soit redirigé vers la page indexUser.html. Lorsque mon professeur se connecte, il est redirigé vers indexProfesor.html et lorsque l'administrateur le fait, il atterrit sur la page indexAdmin.html.
J'avais en tête quelque chose comme ça
if(role.contains("ROLE_ADMIN")){
//redirect from here to indexAdmin.html
}else if(role.contains("ROLE_USER")) {
//redirect to indexUser.html
}else
//redirect to indexProfesor.html
}
Mais je n'ai pas d'image à quoi devrait ressembler le contrôleur entier.
J'ai mon homeContorller qui ressemble à ceci:
@Controller
public class HomeController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage(Model model) {
return "login";
}
}
J'ai également ajouté ce code à mon index.html
<span sec:authorize="isAuthenticated()">
<span sec:authentication="name"></span>
| Roles: <span sec:authentication="principal.authorities"></span> |
Je connais donc bien le rôle de mon utilisateur connecté. Voici aussi le code de mon login.html
<form th:action="@{/login}" method="post" class="l-form">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="hidden" th:name="${_csrf.parameterName}"
th:value="${_csrf.token}" />
<button type="submit" class="btn">Sign in!</button>
</form>
2 réponses
J'ai trouvé une solution qui fonctionne pour moi.
J'ai ajouté http.formLogin().defaultSuccessUrl("/success", true)
à mon fichier SpringConfig .
Donc ça ressemble à ça
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/classesTable").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/success", true)
.and()
.httpBasic();
}
Ensuite, j'ai créé une nouvelle méthode dans HomeController appelée loginPageRedirect
@Controller
public class HomeController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginPage(Model model) {
return "login";
}
@RequestMapping("/success")
public void loginPageRedirect(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException {
String role = authResult.getAuthorities().toString();
if(role.contains("ROLE_ADMIN")){
response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/indexAdmin"));
}
else if(role.contains("ROLE_USER")) {
response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/indexUser"));
}
}
}
J'espère que cela aide quelqu'un avec le même problème.
Première façon
Vous pouvez changer la méthode de votre contrôleur comme suit:
@RequestMapping(value = "/login", method = RequestMethod.GET) public String loginPage(Model model, HttpServletRequest request) { if(request.isUserInRole("ROLE_ADMIN") { // redirect to indexAdmin.html page } else if(request.isUserInRole("ROLE_USER") { // redirect indexUser.html page } else { // redirect to indexProfesor.html page } }
Spring MVC injectera automatiquement quelques propriétés
HttpServletRequest
dans le paramètrerequest
, ce qui vous permettra d'en bénéficier.
Une autre façon
Vous pouvez changer la méthode de votre contrôleur comme suit:
@RequestMapping(value = "/login", method = RequestMethod.GET) public String loginPage(Model model, Authentication authentication) { if(authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) { // redirect to indexAdmin.html page } else if(authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_USER"))) { // redirect indexUser.html page } else { // redirect to indexProfesor.html page } }
Ici, Spring MVC injectera automatiquement les propriétés
Authentication
dans l'objetauthentication
.
De nouvelles questions
spring
Le Spring Framework est un framework open source pour le développement d'applications sur la plate-forme Java. Son cœur est un support riche pour les architectures basées sur les composants, et il compte actuellement plus de vingt modules hautement intégrés.