Роль безопасности Spring не может быть преобразована в предоставленную власть

User.java

public class User implements Serializable{
    @Id
    @Size(min=5,max=15)
    @Column(name="username", unique=true)
    private String username;

    @OneToMany(mappedBy="user")
    private Collection<Role> roles;

public User(User user) {
        this.username=user.username;
        this.roles=user.getRoles();
    }
}

Role.java

public class Role implements Serializable{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String role;

    @ManyToOne
    @JoinColumn(name="username")
    private User user;
}

UserServiceImpl.java

public class UserServiceImpl implements UserServiceDetails {

    private UserRepo userRepo;

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

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        User user=userRepo.findUserByUsername(username);
        if(user == null) {
            throw new UsernameNotFoundException("Could not find user " + username);
        }
        CustomUser customUser=new CustomUser(user);
        return customUser;
    }

    public final static class CustomUser extends User implements UserDetails
    {
        public CustomUser(User user) {
            super(user);
        }

        @SuppressWarnings("unchecked")
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            List<GrantedAuthority> authorities =
                    new ArrayList<GrantedAuthority>();
            authorities.addAll((Collection<? extends GrantedAuthority>) getRoles());

            return authorities;
        }

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

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

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

    }

}

SecurityCOnfig.java

public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private UserDetailsService userDetailsService;

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

Ошибки: Роль не может быть приведена к org.springframework.security.core.GrantedAuthority. Моя таблица ролей содержит роли в строке формы "пользователь", "администратор" и т. Д.

Какие-либо предложения?

Спасибо

1 ответ

Решение

Как говорит Denium, приведение не будет работать так, как это делается в вашем коде. Я делаю похожую вещь, проходя по каждой роли, вот так:

authorities = new HashSet<GrantedAuthority>(roles.size());

for (String role : roles)
    authorities.add(new SimpleGrantedAuthority("ROLE_" + role));
Другие вопросы по тегам