Несколько ролей SecurityConfiguration Spring MVC + Thymeleaf - PullRequest
0 голосов
/ 30 января 2019

У меня есть 2 типа пользовательских ролей, и мне нравится устанавливать разные страницы для каждого типа пользователей после входа в систему, но я не знаю, как это сделать.

SecurityConfiguration

    @Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    public static final String SQL_LOGIN = "select username, password, active as enabled \n"
            + "from user where username = ?";

    public static final String SQL_PERMISSION = "select u.username, r.role as authority\r\n" + 
            "           from user u join user_role ur on u.id = ur.user_id join role r on ur.role_id = r.role_id\r\n" + 
            "           where u.username = ?";

    @Autowired
    private DataSource dataSource;

    @Autowired
    public void configurGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery(SQL_LOGIN)
                .authoritiesByUsernameQuery(SQL_PERMISSION).passwordEncoder(passwordEncoder()); // bcrypt

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/js/**").permitAll()
        .antMatchers("/css/**").permitAll()
        .antMatchers("/img/**").permitAll()
        .antMatchers("/fonts/**").permitAll()
        .antMatchers("/user/**").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login").permitAll()
        .defaultSuccessUrl("/vehicle/list", true)
        .and()
        .logout();
    }

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

}

WebMvcConfig

@Configuration

открытый класс WebMvcConfig реализует WebMvcConfigurer {

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("login");
}

Как я могу создать страницу разной конечной точки, одну для ADMIN и другую для пользователя?

//(ADMIN)
.loginPage("/login").permitAll() 
    .defaultSuccessUrl("/vehicle/list_admin", true)


//USER
.loginPage("/login").permitAll() 
        .defaultSuccessUrl("/vehicle/list", true)

Что-то в этом роде, кто-то может мне помочь, пожалуйста?

Привет

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вам понадобится AuthenticationSuccessHandler.Что-то вроде приведенного ниже кода должно сработать.

public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws
            IOException,
            ServletException {
        User principal = (User) authentication.getPrincipal();
        boolean isAdmin = false;
        Iterator<GrantedAuthority> grantedAuthorityIterator = principal.getAuthorities().iterator();
        while (grantedAuthorityIterator.hasNext()) {
            if (grantedAuthorityIterator.next().getAuthority().equalsIgnoreCase("ADMIN")) {
                isAdmin = true;
            }
        }
        if (isAdmin) {
            response.sendRedirect("/vehicle/list_admin");
        } else {
            response.sendRedirect("/vehicle/list");
        }
    }
}

Кроме того, в вашем файле конфигурации Spring Security вам нужно будет добавить эту опцию..successHandler(CustomAuthenticationSuccessHandler).

0 голосов
/ 30 января 2019

Вам потребуется реализовать AuthenticationSuccessHandler, который проверяет роль и выполняет перенаправление на основе роли.

Проверьте следующий ответ, чтобы получить представление о том, как реализовать обработчик.

AuthenticationSuccessHandler Spring Security

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...