Spring Security получает исключение, запрещенное при перенаправлении в методе настройки WebSecurityConfigurwrAdapter - PullRequest
0 голосов
/ 25 ноября 2018

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

Фрагмент выглядит следующим образом:

 @Configuration 
 @EnableWebSecurity 
 public class UserSecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    CustomSuccessHandler customSuccessHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

     System.out.println("in configure");
     http.csrf().disable()
     .authorizeRequests()
            .antMatchers("/", "/home", "/about").permitAll()
            .antMatchers("/admin").hasAnyRole("ADMIN") // if changed to antMatchers("/admin").permitAll() then it works fine 
            .antMatchers("/user/**").hasAnyRole("USER")
            .anyRequest().authenticated()
     .and()
     .formLogin()
            .loginPage("/login")
            .successHandler(customSuccessHandler)
            .usernameParameter("username")
            .passwordParameter("password")  
            .permitAll()
            .and()
     .logout()
            .permitAll();
    }

CustomSucessHandler.Java

@Component
public class CustomSuccessHandler extends 
 SimpleUrlAuthenticationSuccessHandler {

private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

@Override
protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
        throws IOException {
    String targetUrl = determineTargetUrl(authentication);

    if (response.isCommitted()) {
        System.out.println("Can't redirect");
        return;
    }
    System.out.println("Return URL : "+targetUrl);
    redirectStrategy.sendRedirect(request, response, targetUrl);
}

/*
 * This method extracts the roles of currently logged-in user and returns
 * appropriate URL according to his/her role.
 */
protected String determineTargetUrl(Authentication authentication) {
    String url = "";

    Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

    List<String> roles = new ArrayList<String>();

    System.out.println("authoritirs  "+authorities.size());

    for (GrantedAuthority a : authorities) {
        System.out.println(a.getAuthority());
        roles.add(a.getAuthority());
    }

    if (isDba(roles)) {
        url = "/db";
    } else if (isAdmin(roles)) {
        url = "/admin";
    } else if (isUser(roles)) {
        url = "/home";
    } else {
        url = "/accessDenied";
    }

    return url;
}

private boolean isUser(List<String> roles) {
    if (roles.contains("USER")) {
        return true;
    }
    return false;
}

private boolean isAdmin(List<String> roles) {
    if (roles.contains("ADMIN")) {
        return true;
    }
    return false;
}

private boolean isDba(List<String> roles) {
    if (roles.contains("DBA")) {
        return true;
    }
    return false;
}

public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
    this.redirectStrategy = redirectStrategy;
}

protected RedirectStrategy getRedirectStrategy() {
    return redirectStrategy;
}

}

Всякий раз, когда я регистрируюсь со страницы login.jsp, аутентификация пользователя работает должным образом, после аутентификации пользователя страница должна перенаправляться на страницу администратора, основываясь на роли пользователя, где был написан код для перенаправления.в CustomSuceessandler.TargetUrl в CustomSuccessHandler также печатает URL-адрес как "/ admin" , но в браузере появляется ошибка Forbidden 403.

Если я комментирую код или изменяю код в UserSecurityConfig как.antMatchers ("/ admin"). allowAll () вместо .antMatchers ("/ admin"). hasAnyRole ("ADMIN")

, затем работает нормально и перенаправляется на страницу администратора.

Страница ошибки Whitelabel

Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант.Вс 25 ноября 23:58:01 IST 2018 Произошла непредвиденная ошибка (тип = Запрещено, статус = 403).Запрещено

1 Ответ

0 голосов
/ 26 ноября 2018

Вы получили запрет, потому что hasAnyRole("ADMIN") добавит префикс ROLE_ к данной строке, и поэтому проверка ROLE_ADMIN против ADMIN завершится неудачей.Вместо этого используйте hasAuthority("ADMIN") или переименуйте полномочия в ROLE_ADMIN, чтобы исправить это.

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