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>
1
user8421021 16 août 2017 à 12:03

2 réponses

Meilleure réponse

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.

3
user8421021user8421021 16 août 2017 à 11:44

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ètre request, 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'objet authentication.

2
sunkuet02 16 août 2017 à 11:41