Ошибка безопасности REST при загрузке строки: type = Forbidden, status = 403 - PullRequest
0 голосов
/ 10 декабря 2018

В этом проекте я использовал загрузку Spring, аутентификацию безопасности, JPA и REST

Это дает мне ошибку 403, которая является ошибкой базовой роли.Я пытался в течение 2 дней не может решить, пожалуйста, помогите.

Здесь я делюсь кодом.

Это мой класс конфигурации безопасности имеют роли на основе / привет для всех пользователей и / admin / all и/ admin / add для пользователя с правами администратора.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

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

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests().antMatchers("/api/secure/admin/**").hasRole("ADMIN").antMatchers("/api/secure/**")
            .hasAnyRole("USER", "ADMIN").anyRequest().authenticated().and().formLogin().permitAll();
}

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

}

Это мой класс Controller с 3 методами, основанными на 3 ролях или / hello для всех пользователей, и / admin / all и / admin / add для пользователей admin.

@RestController
@RequestMapping("/api/secure")
public class AdminController {

@Autowired
private UserRepository userRepo;

@Autowired
private BCryptPasswordEncoder passEncp;

@RequestMapping(value = "/hello")
public String hello() {
    return "Hello..";
}

//@PreAuthorize("hasAnyRole('ADMIN')")
@RequestMapping(value = "/admin/add", method = RequestMethod.POST)
public String addUserByAdmin(@RequestBody User user) {
    user.setPassword(passEncp.encode(user.getPassword()));
    userRepo.save(user);
    return "Add User Successfully";
}

//@PreAuthorize("hasAnyRole('ADMIN')")
@GetMapping("/admin/all")
public String securedHello() {
    return "Secured Hello";
}
}

Это компонент Role

@Entity
@Data
public class Role {
@Id
@GeneratedValue
private int roleId;
private String role;
}

Этот пользовательский компонент

@Entity
@Setter
@Getter
public class User {
@Id
private int userId;
private String username;
private String password;
private String email;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name="user_role", joinColumns = @JoinColumn(name="user_id"), inverseJoinColumns = @JoinColumn(name="role_id"))
private Set<Role> roles;
}

Интерфейс UserRepository

public interface UserRepository extends JpaRepository<User, Integer> {

User findByUsername(String username);

}

Класс CustomUserDetails Я думаю, чтопроблема в этой части.У меня есть роль сохранения, как ROLE_USER, ROLE_ADMIN также пробовал без ROLE_

@Getter
@Setter
public class CustomUserDetails implements UserDetails {

private User user;

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return user.getRoles().stream().map(role -> new SimpleGrantedAuthority(""+role))
            .collect(Collectors.toList());
}

@Override
public String getPassword() {
    // TODO Auto -generated method stub
    return user.getPassword();
}

@Override
public String getUsername() {
    // TODO Auto-generated method stub
    return user.getUsername();
}

Класс обслуживания CustomUserDetailsService

@Service
public class CustomUserDetailsService implements UserDetailsService {

@Autowired
private UserRepository userRepo;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = userRepo.findByUsername(username);
    CustomUserDetails userDetails = null;
    if(user!=null) {
        userDetails = new CustomUserDetails();
        userDetails.setUser(user);
    }else {
        throw new UsernameNotFoundException("User not found with name "+username);
    }
    return userDetails;
}
}

У меня есть другой класс Controller с другим отображением URL, который выполняется

Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 декабря 2018

WebSecurityConfigurerAdapter имеет перегруженное сообщение конфигурации, которое принимает WebSecurity в качестве аргумента, который принимает совпадения муравьев по запросам, которые должны игнорироваться.

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/hello");
}

Вы можете игнорировать / hello на основе url как его для всех пользователей.

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