Nano Hash - криптовалюты, майнинг, программирование

Spring Security 4 Не назначает роль администратора

Я пытаюсь назначить роль администратора пользователю в своем веб-приложении, используя spring mvc и spring security 4. Я вручную назначаю роль пользователю в базе данных, а затем я просто пытаюсь получить доступ к URL-адресу в мое веб-приложение, однако я получаю ошибку 403, что было бы хорошо, если бы я просто пытался получить доступ как обычный пользователь, но я использую администратора, чтобы попытаться получить к нему доступ. Я покажу часть своего кода и посмотрю, увидит ли кто-нибудь, что я упускаю. Заранее спасибо.

Вот мой объект домена пользователя

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Table(name="users")
public class User {

private Long id;

@Size(min=4, max=30)
private String username;

private String password;

private String email;

private University university;

private Set<Course> courses = new TreeSet<>();

private Set<QuestionAnswerSet> questionAnswerSets = new TreeSet<>();

private Set<Post> posts = new TreeSet<>();

private Set<Comment> comments = new TreeSet<>();

private Set<Authorities> authorities = new HashSet<>();

public User () {}

public User(User user) {
    this.username = user.getUsername();
    this.password = user.getPassword();
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}
public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public CharSequence setPassword(String password) {
    return this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@ManyToOne
@NotNull
public University getUniversity() {
    return university;
}

public void setUniversity(University university) {
    this.university = university;
}

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy="user")
public Set<Course> getCourses() {
    return courses;
}

public void setCourses(Set<Course> courses) {
    this.courses = courses;
}

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user")
public Set<QuestionAnswerSet> getQuestionAnswerSets() {
    return questionAnswerSets;
}

public void setQuestionAnswerSets(Set<QuestionAnswerSet> questionAnswerSets) {
    this.questionAnswerSets = questionAnswerSets;
}
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user")
public Set<Post> getPosts() {
    return posts;
}

public void setPosts(Set<Post> posts) {
    this.posts = posts;
}
@JsonManagedReference
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user")
public Set<Comment> getComments() {
    return comments;
}
public void setComments(Set<Comment> comments) {
    this.comments = comments;
}

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, mappedBy="user")
public Set<Authorities> getAuthorities() {
    return authorities;
}

public void setAuthorities(Set<Authorities> authorities) {
    this.authorities = authorities;
}

public static User createUser(String username, String email, String password) {
    User user = new User();

    user.username = username;
    user.email = email;
    user.password = new BCryptPasswordEncoder().encode(password);

    return user;
}

public User(Long id, String username, String password, String email, University university,
        Set<QuestionAnswerSet> questionAnswerSets, Set<Post> posts, Set<Comment> comments, Set<Authorities> authorities) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.email = email;
    this.university = university;
    this.questionAnswerSets = questionAnswerSets;
    this.posts = posts;
    this.comments = comments;
    this.authorities = authorities;
}

public User(UserDetails userDetails) {
    // TODO Auto-generated constructor stub
}
}

Вот возражают мои власти. В моей базе данных у меня есть идентификатор «1», полномочия «ADMIN» и пользователь «1», что соответствует первому пользователю, которого я ввел в базу данных.

@Entity
public class Authorities implements GrantedAuthority {

private static final long serialVersionUID = -2848940318555407665L;
private Long id;
private User user;
private String authority;

@Id
@GeneratedValue
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
@ManyToOne
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}
public String getAuthority() {
    return authority;
}
public void setAuthority(String authority) {
    this.authority = authority;
}
}

Мой WebSecurityConfig

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

private static PasswordEncoder encoder;

@Autowired
private UserDetailsService customUserDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf()
    .csrfTokenRepository(csrfTokenRepository());

    http
    .authorizeRequests()
        .antMatchers("/", "/home", "/register", "/courses", "/editCourse", "/sets", "/search", "/viewCourse/{courseId}", "/fonts/glyphicons-halflings-regular.ttf","/fonts/glyphicons-halflings-regular.woff", "/fonts/glyphicons-halflings-regular.woff2", "/viewCourse/post/{postId}", "/courseSearch", "/setSearch").permitAll()
        .antMatchers("/createCourse", "/addUniversities").hasRole("ADMIN")
        .anyRequest().authenticated();

    http
    .formLogin()
         .loginPage("/login")
         .usernameParameter("username").passwordParameter("password")
            .permitAll()
            .and()
         .logout()
            .permitAll()
            .logoutSuccessUrl("/loggedout")
            .and()
            .sessionManagement()
                .maximumSessions(1);


}

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

@Bean
public PasswordEncoder passwordEncoder() {
    if(encoder == null) {
        encoder = new BCryptPasswordEncoder();
    }

    return encoder;
}

private CsrfTokenRepository csrfTokenRepository() 
{ 
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
    repository.setSessionAttributeName("_csrf");
    return repository; 
}
}

Пользовательские данные пользователя

public class CustomUserDetails extends User implements UserDetails{

private User user;

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

private static final long serialVersionUID = 2020921373107176828L;

public CustomUserDetails () {}

public CustomUserDetails (User user) {
    super(user);
}

@Override
public Set<Authorities> getAuthorities() {
    return super.getAuthorities();
}
@Override
public boolean isAccountNonExpired() {
    return true;
}
@Override
public boolean isAccountNonLocked() {
    return true;
}
@Override
public boolean isCredentialsNonExpired() {
    return true;
}
@Override
public boolean isEnabled() {
    return true;
}
}

И мой UserDetailsServiceImpl

@Service
@Qualifier("customUserDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

private UserRepository userRepo;

@Transactional
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    com.example.domain.User user = userRepo.findByUsername(username);

    CustomUserDetails customUserDetails = new CustomUserDetails(user);
    customUserDetails.setUser(user);

    return customUserDetails;
}

@Autowired
public void setUserRepo(UserRepository userRepo) {
    this.userRepo = userRepo;
}

}

Ответы:


1

Используйте hasAuthority() вместо hasRole(), если ваша запись в базе данных просто "ADMIN".

Если вы хотите использовать hasRole, вы должны изменить запись базы данных на "ROLE_ADMIN"

11.12.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..