Я просто работаю над безопасностью 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).Запрещено