Как добавить объект в представление после успешного входа в систему с помощью Spring Security? - PullRequest
0 голосов
/ 22 сентября 2019

После успешного входа в систему я пытаюсь перенаправить на страницу, на которой требуется создание объекта, как описано здесь в моем HomeController:

@RequestMapping(value={"/","/home"}, method=RequestMethod.GET)
public ModelAndView home() {
    ModelAndView view = new ModelAndView("home");
    view.addObject("client", new Client());
    return view;
}

Проблема в том, что я не знаюкак сделать это с помощью Spring Security, так как единственная настройка, которую я могу сделать, это настроить страницу после успешного входа в систему:

.formLogin()
    .loginPage("/login")
    .defaultSuccessUrl("/home")
    .permitAll()

Как добавить этот объект в представление после успешного входа в систему с использованием Spring Security

1 Ответ

0 голосов
/ 22 сентября 2019

Если у вас есть такая конфигурация WebSecurity.Вам просто нужно добавить successHandler

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private SimpleAuthenticationSuccessHandler successHandler;

    @Bean("authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        // @formatter:off
        auth.inMemoryAuthentication()
            .withUser("user1").password("{noop}user1Pass").roles("USER")
            .and()
            .withUser("admin1").password("{noop}admin1Pass").roles("ADMIN");
        // @formatter:on
    }


    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/anonymous*").anonymous()
            .antMatchers("/login*").permitAll()
            .anyRequest().authenticated()

            .and()
            .formLogin()
            .loginPage("/login.html")
            .loginProcessingUrl("/login")
            .successHandler(successHandler)
            // ...        
    }
}

SimpleAuthenticationSuccessHandler Class

// Change onAuthenticationSuccess logic as per your requirement

@Component
public class SimpleAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Override
    public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1, Authentication authentication)
            throws IOException, ServletException {


        redirectStrategy.sendRedirect(arg0, arg1, "/home");


        /*
        Collectionextends GrantedAuthority> authorities = authentication.getAuthorities();
        authorities.forEach(authority -> {
            if(authority.getAuthority().equals("ROLE_USER")) {
                try {
                    redirectStrategy.sendRedirect(arg0, arg1, "/user");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else if(authority.getAuthority().equals("ROLE_ADMIN")) {
                try {
                    redirectStrategy.sendRedirect(arg0, arg1, "/admin");
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else {
                throw new IllegalStateException();
            }
        });

        */


    }

}

Это перенаправит ваш вызов на "/home", и контроллер будет продолжать заботиться о загрузке ваших объектов.

Подробнее здесь

...