Ошибка входа в Spring Security при попытке получить доступ к URL после аутентификации - PullRequest
0 голосов
/ 01 марта 2020

Я изучаю Spring Security и следовал нескольким учебникам на Youtube, я выполнил задание в соответствии с указаниями автора / учителя, но, к сожалению, я не смог войти в систему, когда попытался получить доступ к своим URL для / user и / admin после входа в систему, хотя я получаю предоставленный объект полномочий из базы данных с ролями USER_USER и USER_ADMIN, но, тем не менее, когда я запрашиваю эти URL-адреса, я выбрасываю исключение для запрещенного доступа, любой может объяснить, почему это происходит?

@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyUserDetailsService userDetailsService;

    /*Authentication method*/
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //auth.inMemoryAuthentication().withUser("admin").password("admin").roles("Admin").and().withUser("user").password("user").roles("User");
        auth.userDetailsService(userDetailsService);
    }

    // Authorization - Should be from most secure to least one
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // To allow access to any url without permission is by using permitAll() method
        System.out.println("Accessign URL : ");
        http.authorizeRequests().
                antMatchers("/admin").hasRole("USER_ADMIN").
                antMatchers("/user").hasAnyRole("USER_USER", "USER_ADMIN").
                antMatchers("/", "static/css", "static/js").
                permitAll().
                and().
                formLogin();
    }

    @Bean
    public PasswordEncoder getPasswordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
}

MyUserDetails Класс:

package com.springsecurity.demo.models;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class MyUserDetails implements UserDetails {

    private static final long serialVersionUID = -3042145577630945747L;
    private String userName;
    private String password;
    private List<GrantedAuthority> authorityList;

    public MyUserDetails() {
    }

    public MyUserDetails(User user) {
        this.userName = user.getUserName();
        this.password = user.getPassword();
        this.authorityList = Arrays.stream(user.getUserRole().trim().split(",")).map(SimpleGrantedAuthority::new).collect(Collectors.toList());
        System.out.println((this.authorityList.size() > 0 ? this.authorityList.get(0) : "Empty"));
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorityList;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return userName;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

Класс MyUserDetailsService:

@Service
public class MyUserDetailsService implements UserDetailsService {

    private UserRepository userRepository;

    public MyUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        Optional<User> user = userRepository.findByUserName(userName);

        user.orElseThrow(() -> new UsernameNotFoundException("User not found with name : " + userName));

        return user.map(MyUserDetails::new).get();
    }
}

Класс UserRepository:

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    Optional<User> findByUserName(String userName);
}

Класс контроллера:

@RestController
public class GreetingController {

    @RequestMapping(value = "/")
    public String greet() {
        return "Hello World!";
    }

    @RequestMapping(value = "/user")
    public String greetUser() {
        return ("<h1>Hello User!</h2");
    }

    @RequestMapping(value = "/admin")
    public String greetAdmin() {
        return ("<h1>Hello Admin!</h2");
    }
}

Спасибо

1 Ответ

0 голосов
/ 02 марта 2020

Я нашел ответ, просто обновив значения в столбце user_roles своей базы данных с USER_USER & USER_ADMIN до ROLE_USER & ROLE_ADMIN, это сработало для меня, я точно не знаю причину, но было указано, что класс SimpleGrantedAuthority ожидает иметь имена ролей, например Role_Admin & Role_User формат, и он работал отлично для меня. Наряду с изменением базы данных я обновил метод настройки WebSecurity следующим образом:

protected void configure(HttpSecurity http) throws Exception {
        // To allow access to any url without permission is by using permitAll() method
        System.out.println("Accessign URL : ");
        http.authorizeRequests().
                antMatchers("/admin", "/api/v1/users").hasRole("ADMIN").
                antMatchers("/api/v1/students", "/api/v1/courses").hasAnyRole("USER", "ADMIN").
                antMatchers("/", "static/css", "static/js").
                permitAll().
                and().
                formLogin();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...