Доступ запрещен при входе пользователя в систему с ролью «АДМИНИСТРАТОР», но не в роли «ПОЛЬЗОВАТЕЛЬ»

#spring-boot #spring-security #thymeleaf

#весенняя загрузка #spring-безопасность #thymeleaf

Вопрос:

WebSecurityConfiguration

 @Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(bCryptPasswordEncoder);
    }

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

        String loginPage = "/login";
        String logoutPage = "/logout";

        http
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers(loginPage).permitAll()
                //.antMatchers("/registration").permitAll()
                .antMatchers("/user/**").hasAnyAuthority("USER","ADMIN")
                .anyRequest().authenticated()
                .and()
            .csrf().disable()
            .formLogin()
                .loginPage(loginPage)
                .loginPage("/")
                .failureUrl("/login?error=true")
                .defaultSuccessUrl("/user")
                .usernameParameter("username")
                .passwordParameter("password")
                .and()
            .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher(logoutPage))
                .logoutSuccessUrl(loginPage).and().exceptionHandling();
    }
}
  

MyUserDetailsService

 @Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    @Transactional
    public UserDetails loadUserByUsername(String userName) {
        User user = userService.findUserByUserName(userName);
        List<GrantedAuthority> authorities = getUserAuthority(user.getRoles());
        return buildUserForAuthentication(user, authorities);
    }

    private List<GrantedAuthority> getUserAuthority(Set<Role> userRoles) {
        Set<GrantedAuthority> roles = new HashSet<>();
        for (Role role : userRoles) {
            roles.add(new SimpleGrantedAuthority(role.getRole()));
        }
        return new ArrayList<>(roles);
    }

    private UserDetails buildUserForAuthentication(User user, List<GrantedAuthority> authorities) {
        return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(),
                user.getActive(), true, true, true, authorities);
    }
}
  

Модель

 @Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private long id;
    
    @Column(name = "username")
    private String userName;
    
    @Column(name = "password")
    private String password;

    @Column(name = "active")
    private Boolean active;

    @ManyToMany(cascade = CascadeType.MERGE)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    // getters and setters 
}


@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")

    private int id;
    @Column(name = "role")
    private String role;

    // getters and setters
}
  

Я получил ошибку входа в систему безопасности Spring Boot. Я получил ошибку при входе в систему с ролью администратора. Но когда я вошел в роль пользователя, она работает хорошо. Я не понимаю, почему это происходит?

Когда я пытаюсь войти в систему как администратор, он перенаправляет меня http://localhost:8080/error страница показывает это в теле:

 {"timestamp":"2020-09-11T14:10:05.108 00:00","status":999,"error":"None","message":""}
  

Но при попытке входа в систему как пользователя все работает нормально.

Комментарии:

1. Какой URL вы вызываете?

2. Я позвонил http://localhost:8080/login

3. Попробуйте добавить permitAll() в .formLogin() .

4. Я попытался добавить PermitAll (), но это выдает ошибку при входе в систему администратора

Ответ №1:

Возможно, вы напутали с antMatchers!!

В вашем коде, который вы упомянули, как

 .antMatchers("/user/**").hasAnyAuthority("USER","ADMIN")
  

Это означает, что и пользователь, и администратор могут иметь доступ к URL, которые соответствуют «/ user /**», т.Е.. все URL-адреса с префиксом «/ user /»

Если у вас есть URL для администратора, который с «/ admin / * «, то вы также должны предоставить доступ к «/ admin /**»!

Затем вам нужно добавить еще один antMatcher, например

 .antMatchers("/admin/**).hasRole("ADMIN")
  

который предоставит доступ только к URL-адресу администратора ie,. с префиксом «/ admin /**»